比较两个数据帧并根据第一个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返回差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章