【问题标题】:Calculating difference between two pandas dataframes with same columns and some mismatching rows计算具有相同列和一些不匹配行的两个熊猫数据框之间的差异
【发布时间】:2020-01-08 12:18:16
【问题描述】:

df1

fileName     obj1   obj2   obj3   obj4
file_01.jpg  1      1      1
file_02.jpg         1      1
file_03.jpg  1      2             1

df2

fileName     obj1   obj2   obj3   obj4
file_01.jpg  1             2
file_02.jpg         1      1
file_04.jpg         3      1      2

假设我有两个像上面这样的 pandas DataFrame,问题:我如何计算这两个之间的差异以获得如下所示的最终 DataFrame?

预期输出
结果df

fileName     obj1   obj2   obj3   obj4
file_01.jpg  0      1      -1      0
file_02.jpg  0      0      0      0
file_03.jpg  1      2      0      1      
file_04.jpg  0      -3     -1     -2

我已经尝试过的:我通过将两个 DataFrame 合并在一起,然后计算两列之间的差异来得出结果。在 SO 中提出这个问题,看看是否有其他有效的方法。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我似乎找不到 groupby 减法,所以我将你的第二个 df 乘以 -1,所以 sum 可以产生所需的结果

    obj_cols = ['obj1', 'obj2', 'obj3', 'obj4']
    df2[obj_cols] *= -1
    
    pd.concat([df1, df2]).groupby(['fileName'], as_index=False).sum()
    
          fileName  obj1  obj2  obj3  obj4
    0  file_01.jpg     0     1    -1     0
    1  file_02.jpg     0     0     0     0
    2  file_03.jpg     1     2     0     1
    3  file_04.jpg     0    -3    -1    -2
    

    【讨论】:

      【解决方案2】:

      我认为你很接近。我只想:

      • 做一个外部连接
      • groupby 文件名和 sum
      • 重置索引

      喜欢:

      In [25]: df1                                                                    
      Out[25]: 
         a  value
      0  2     33
      1  3     10
      2  5      2
      
      In [26]: df2                                                                    
      Out[26]: 
         a  value
      0  1     -1
      1  3      2
      2  5    -50
      
      In [27]: df3 = df1.merge(df2, how='outer')                                      
      
      In [28]: df3                                                                    
      Out[28]: 
         a  value
      0  2     33
      1  3     10
      2  5      2
      3  1     -1
      4  3      2
      5  5    -50
      
      In [29]: df3.groupby('a').sum().reset_index()                                   
      Out[29]: 
         a  value
      0  1     -1
      1  2     33
      2  3     12
      3  5    -48
      

      【讨论】:

      • 感谢杰夫!我只是在寻找其他方法来实现结果,这很有帮助!
      猜你喜欢
      • 2020-04-28
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2016-11-13
      • 2016-07-22
      相关资源
      最近更新 更多