(更新:添加了所需的数据帧)
首先,我有理由相信我在几年前找到了这个问题的解决方案,但是我没有能够重新找到那个解决方案。
能够解决类似问题,但不能解决我的特定问题的问题包括:
有效地选择与Pandas DataFrame中的多个值之一匹配的行
- 有效地将基于索引值的计算行添加到熊猫DataFrame
- 比较Python Pandas DataFrames是否匹配行
假设我有一个数据框,其中包含我正在处理的列:
big = pd.DataFrame({'match_1': [11, 12, 51, 52]})
big
match_1
0 11
1 12
2 51
3 52
我还有一个更小的数据框架,理论上,它将一些条件语句映射到所需的值:
# A smaller dataframe that we use to map values into the larger dataframe
small = pd.DataFrame({'is_even': [True, False], 'score': [10, 200]})
small
is_even score
0 True 10
1 False 200
这里的目标是使用条件语句将
大
中的每一行与小
中的单行匹配。假设小
的构造使得大
中的每一行总是有一个,并且只有一个匹配。(如果小
中必须有多行匹配,只需选择第一个。)
期望的输出类似于:
desired = pd.DataFrame({'match_1': [11, 12, 51, 52], 'metric': [200, 10, 200, 10]})
desired
match_1 metric
0 11 200
1 12 10
2 51 200
3 52 10
我很确定语法看起来类似于:
big['score'] = small.loc[small['is_even'] == ( (big['match_1'] / 2) == 0), 'score']
这样不行,因为< code>small['is_even']
是长度为2的数列,而< code >((big[' match _ 1 ']/2)= = 0)是长度为4的数列。我要做的是,对于< code>big中的每一行,找到< code>small中基于条件匹配的一行。
如果我可以得到一个序列,其中包含与大
中的每一行匹配的小
中的正确行,那么我可以执行以下操作:
`big['score'] = small.loc[matching_rows, 'score']
我的问题是:如何生成序列匹配行
?
如果<code>big</code>和<code>small</code>中的列仅在常量值上匹配,这将是<code>大的直接使用。merge()或大。groupby()
,但是,在我的例子中,映射可以是任意复杂的布尔条件,例如:
(big['val1'] > small['threshold']) & (big['val2'] == small['val2']) & (big['val3'] > small['min_val']) & (big['val3'] < small['max_val'])
依赖于 isin()
、any()
等的解决方案不起作用,因为条件检查可以任意复杂。
我当然可以创建一个函数,将<code>apply()
答案可能归结为“计算一些中间列,直到您可以进行简单的合并”或“只需使用< code>apply(),但是我敢发誓,有一种方法可以做到我上面所描述的。
您可以用True和False对< code>small进行索引,然后直接执行< code >。ix在上面查找。不确定它是否比中间列/合并更整洁:
In [127]: big = pd.DataFrame({'match_1': [11, 12, 51, 52]})
In [128]: small = pd.DataFrame({'score': [10, 200]}, index=[True, False])
In [129]: big['score'] = small.ix[pd.Index(list(big.match_1 % 2 == 0))].score.values
In [130]: big
Out[130]:
match_1 score
0 11 200
1 12 10
2 51 200
3 52 10
一种方法是使用< code>merge,其中< code>on_left不是一个列,而是一个键向量。通过将< code>small的索引设置为< code>is_even,事情变得更简单:
>>> small.set_index('is_even', inplace=True)
>>> condition = big['match_1'] % 2 == 0
>>> pd.merge(big, small, left_on=condition, right_index=True, how='left')
match_1 score
0 11 200
1 12 10
2 51 200
3 52 10
我有这种熊猫。数据框。“a”、“b”是获得“x”和“y”时的条件。 我需要绘制关于相同条件的(x,y)结肠的折线图。预期结果图为: 当然,这个图像是由以下代码手动给出的: 我的问题是,当获得一个包含条件列x和y的数据帧时,如何动态地绘制如上所述的图。 列名是固定的。但是,条件列的值是动态更改的。因此,我不能使用10、20、100、200的值。 如果我有下面的“用a和b过滤”方法,我认为问题解决了:
假设我有2个数据帧: DF1: Col1 | Col2 | Col3 XCN000370/17-18C|XCN0003711718C|0003971718 DF2 Col1 | Col2 | Col3 XCN0003711718C|XCN0003711718C|0003971718 我希望它们像这样合并: 首次匹配Col1(DF1)和Col1(DF2) 在保持不匹配的情况下,将Col1(DF1)与
假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是:
我有这个熊猫数据框 这就给了我: 我该怎么办 做一个新的人物, 将标题添加到图"标题这里" 以某种方式创建一个映射,这样标签不是29,30等,而是“29周”,“30周”等。 将图表的较大版本保存到我的计算机(例如10 x 10英寸) 这件事我已经琢磨了一个小时了!
我有2个熊猫数据框 df1= df2= 我想使用df2“类”列中的可能值搜索df1中的“课程”列,然后返回适当的合计权重。 这是我目前所知道的 导致 我怎样才能得到这样的东西 任何帮助都将不胜感激。谢谢
我正在读熊猫的CSV文件。假设CSV如下所示: 我想从(即)中获取值,其中和。我确信只有一行符合此条件。 所以我在做这样的事情: 我尝试了来给我这个值,但是它返回了一个数据帧,索引是此行的行号。此处的行号不是0,而是1(即CSV文件中的原始行号),这不允许我执行 如何在这里获得列值?