【问题标题】:Compre two dataframes on multiple columns比较多列上的两个数据框
【发布时间】:2021-11-30 14:38:36
【问题描述】:

我有两个数据框,它们都有相同的列。我想比较它们,并为每两行找到不同的,在哪一列上它们具有不同的值

我的数据框如下:

A 列是唯一键两个数据框共享

df1

    A   B   C   D   E
0   V   10  5   18  20
1   W   9   18  11  13
2   X   8   7   12  5
3   Y   7   9   7   8
4   Z   6   5   3   90

df2

    A   B   C   D   E
0   V   30  5  18  20
1   W   9   18  11  9
2   X   8   7   12  5
3   Y   36   9   7  8
4   Z   6   5   3   90

预期结果:

df3

    A  key
0   V   B  
1   W   E 
3   Y   B

到目前为止我尝试过的是:

df3 = df1.merge(df2, on=['A', 'B', 'C', 'D', 'E'], how='outer', indicator=True)
df3 = df3[df3._merge != 'both'] #to retrieve only the rows where there's a difference spotted

这就是我为 df3 得到的东西

    A   B   C   D   E   _merge
0   V   10  5   18  20  left_only
1   W   9   18  11  13  left_only
3   Y   7   9   7   8   left_only
5   V   30  5  18  20   right_only
6   W   9   18  11  9   right_only
8   Y   36   9   7  8   right_only

我怎样才能达到预期的效果?

【问题讨论】:

  • 数据框是否也有相同的行(或相同的键,按顺序)?
  • 在存在多个不同列的情况下,您希望得到什么结果?

标签: python python-3.x pandas


【解决方案1】:

在您的情况下,您可以先设置索引,然后再设置eq

s = df1.set_index('A').eq(df2.set_index('A'))
s.mask(s).stack().reset_index()
Out[442]: 
   A level_1      0
0  V       B  False
1  W       E  False
2  Y       B  False

【讨论】:

    【解决方案2】:

    您可以找到两个框架之间的差异,并使用idxmaxaxis=1 来获取不同的列:

    diff = df1.set_index("A") - df2.set_index("A")
    result = diff[diff.ne(0)].abs().idxmax(1).dropna()
    
    >>> result
    A
    V    B
    W    E
    Y    B
    dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多