具体来说,我想遍历两个数据框,其中一个较大,另一个较小。
最终,我想比较某个列中的值。
我试图创建一个嵌套的for循环;外循环遍历大数据框而内循环遍历小数据框,但是我遇到了困难。
我正在寻找一种方法来识别大型数据框中的“名称”和“值”与小型数据框中的匹配。
背景信息:我正在使用熊猫库。
大型数据框:
小数据框:
Name Value
SF 12.84
TH -49.45
答案 0 :(得分:1)
如果目标是遍历一个或多个DataFrame
,则明确的for
循环通常是错误的举动。在这种情况下,因为您尝试
确定大型数据框中的“名称”和“值”与小型数据框中的
您要查找的操作是pd.merge
或pd.DataFrame.join
,它们“在幕后”进行比较并返回匹配的信息。因此,假设您有2个DataFrame
,它们分别称为large
和small
。然后
import pandas as pd
new_large = pd.merge(left=large,
right=small,
how='left',
on=('Name', 'Value'),
indicator=True)
new_large._merge = new_large._merge.apply(lambda x: 1 if x=='both' else 0)
通过在large
和small
(how='left'
)之间进行左联接,pd.merge
返回large
中包含{{1 }}在small
元组上。然后,大部分繁重的工作都由('Name', 'Value')
关键字完成,该关键字引用了indicator
版本0.25.0文档:
如果为True,则使用以下命令将一列添加到输出数据框架“ _merge”中: 有关每行来源的信息。 信息列为分类类型,其值为“ left_only” 对于其合并键仅出现在“左” DataFrame中的观察, “ right_only”用于其合并键仅出现在“ right”中的观测值 DataFrame,如果在两者中都找到观察的合并键,则为“两者”。
因此,pd.merge
是原始的new_large
large
,其中有一个名为DataFrame
的新列,其条目对应于与{ {1}}位于_merge
上(按值large
),并且与small
和Name
上匹配的行;后者的值为'left_only'
。最后一步是按照您的指定将Name
和Value
更改为both
和both
。
现在,左联接返回了它所做的操作,因为小left_only
中的两个1
值都出现在0
Name
中,因此左联接DataFrame
和large
返回了整个DataFrame
large
。如果不是这种情况,则small
会产生large
个值,您将不得不使用一些技巧来获得漂亮的布尔值(整数)列,以显示匹配的内容和不匹配的内容没错HTH。