当前位置: 首页 > 知识库问答 >
问题:

熊猫:有条件地匹配较小数据帧中的行

柳俊逸
2023-03-14

(更新:添加了所需的数据帧)

首先,我有理由相信我在几年前找到了这个问题的解决方案,但是我没有能够重新找到那个解决方案。

能够解决类似问题,但不能解决我的特定问题的问题包括:

  • 有效地选择与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(),但是我敢发誓,有一种方法可以做到我上面所描述的。

共有2个答案

谭繁
2023-03-14

您可以用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
劳英华
2023-03-14

一种方法是使用< 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文件中的原始行号),这不允许我执行 如何在这里获得列值?