比较两列中的两个数据场并获得差异

Posted

技术标签:

【中文标题】比较两列中的两个数据场并获得差异【英文标题】:Compare two datafarmes in two columns and get the difference 【发布时间】:2022-01-22 03:30:18 【问题描述】:

假设我有一个像这样的数据框:

df1:
     col1          col2
0    data1         math
1    data1         math2
2    data2         math
3    data3         math
4    data4         math2

df2:
     col1          col2
0    data1         math
1    data1         math2
2    data1         math3
3    data2         math2
4    data3         math
5    data4         math2
6    data4         math3

如何根据 col1 和 col2 比较这两个数据帧并获得差异(删除与 df1 匹配的所有行)并拥有这样的数据帧:

     col1          col2
0    data1         math3
1    data2         math2
2    data4         math3

我试过这个,但它不起作用:

df3 = df2[~(df2['col2'].isin(df1['col2']))].reset_index(drop=True)

【问题讨论】:

【参考方案1】:

您可以与indicator=True 执行合并,并只保留right_only 行:

(df1.merge(df2, on=['col1', 'col2'], how='outer', indicator=True)
    .query('_merge == "right_only"')
    .drop(columns='_merge').reset_index(drop=True)
)

输出:

    col1   col2
0  data1  math3
1  data2  math2
2  data4  math3

【讨论】:

【参考方案2】:

您的解决方案应该通过比较 MultiIndex 或元组来更改:

df3 = df2[~df2.set_index(['col1','col2']).index.isin(df1.set_index(['col1','col2']).index)].reset_index(drop=True)

df3 = df2[~df2[['col1','col2']].apply(tuple, 1).isin(df1[['col1','col2']].apply(tuple, 1))].reset_index(drop=True)

【讨论】:

以上是关于比较两列中的两个数据场并获得差异的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 PostgreSQL 中的两个平均值之间的差异,平均值在列上,最终表按两列分组?

比较具有相同模式的两个表以获得数据差异

Excel根据标题比较两列以查找同一行中的匹配或差异

根据两列中的匹配值为日期差异创建条件列

使用python返回excel中两个不同文件中两列之间的差异

如何比较 2 个 iframe 并在视觉上获得差异?