比较两个数据帧并根据第一个df返回差异[重复]

Posted

技术标签:

【中文标题】比较两个数据帧并根据第一个df返回差异[重复]【英文标题】:Compare two dataframes and returns difference based on the first df [duplicate] 【发布时间】:2020-07-31 12:25:39 【问题描述】:

我有两个示例 dfs,如下所示:

df1
    Name    DOB
0   AMY     20100101
1   AMANDA  19990213
2   LEO     19920103
3   RIO     20200109
4   JEFF    20050314

df2
    Name    DOB
0   AMY     20100101
1   LEO     19920103
2   SEAN    19971123
3   BEN     20170119
4   SAM     20020615
5   YI      19930202
6   RICHAEE 19980919
7   MICHAEL 19920229

我想比较两个dfs,预期的结果如下:

Name      DOB
AMANDA    19990213
RIO       20200109
JEFF      20050314

我尝试使用左连接,但没有达到我的预期

df1=pd.DataFrame('Name':['AMY','AMANDA','LEO','RIO','JEFF'],
                  'DOB':['20100101','19990213','19920103','20200109','20050314'])

df2=pd.DataFrame('Name':['AMY','LEO','SEAN','BEN','SAM','YI','RICHAEEL','MICHAEL'],
                  'DOB':['20100101','19920103','19971123','20170119','20020615','19930202','19980919','19920229'])

pd.merge(df1, df2, on='Name', how='left')

谁能帮助我?谢谢!

【问题讨论】:

嗨,这很有趣,我想知道这是否会引起人们的兴趣***.com/questions/28901683/… 这也被称为“反加入”***.com/questions/38516664/anti-join-pandaspd.merge(df1, df2[['Name']], on='Name', how='left', indicator=True).loc[lambda df: df['_merge'] == 'left_only'].drop(columns='_merge') 使用df1[~df1['Name'].isin(df2['Name'])] @mcskinner 谢谢。很高兴学习了反加入!您能否将解决方案发布到答案中,我可以接受吗?谢谢! pd.merge(df1, df2[['Name']], on='Name', how='left', indicator=True).loc[lambda x: x['_query']=='left_only'].drop(columns='_merge') 【参考方案1】:

这也称为“反连接”。

(pd.merge(df1, df2[['Name']], on='Name', how='left', indicator=True)
    .loc[lambda df: df['_merge'] == 'left_only']
    .drop(columns='_merge'))
#      Name       DOB
# 1  AMANDA  19990213
# 3     RIO  20200109
# 4    JEFF  20050314

【讨论】:

这是重复的 od pandas 合并 101,也不要在 cmets 中复制解决方案 @ansev OP 要求将我的评论翻译成他们的答案。我看到您稍后发布了相同的解决方案。我认为答案中有价值的部分是找到“anti join”的词汇帮助,否则这不容易找到。 实际上,如果您看一下,我的评论比您的评论早了几分钟。信不信由你,我独立想出了我的解决方案。 在这种特殊情况下,由于数据框的简单性,使用 series.isin 会快得多。除了 loc 和 drop 之外,使用 series.isin 进行布尔索引比使用诸如 merge 之类的复杂方法要快得多

以上是关于比较两个数据帧并根据第一个df返回差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何比较两个熊猫数据框并返回将它们相互映射的索引?

如果匹配,如何合并两个数据帧并从新列中的另一列返回数据?

尝试根据每个数据帧中的经纬度差异比较两个数据帧

熊猫不显示第一列[重复]

如何通过比较火花中相同列的两个数据帧来计算列值的数量

pyspark 数据框比较以根据关键字段查找列差异