首页 > 解决方案 > 合并熊猫数据框的列差异

问题描述

我有 2 个要合并的数据框。数据框之间的大多数列都是相同的。然而,有些列是不同的,我想要差异。我的专栏可能如下所示:

df1:
   A  B  C  D  E
0  0  3  8  7  6
1  1  4  1  1  3
2  2  5  2  2  4
df2:
   A  B  C  D  E
0  0  3  1  5  6
1  1  4  2  4  4
2  2  5  3  3  5
desired df3:
   A  B  C  D  E
0  0  3  7  2  0
1  1  4 -1 -3 -1
2  2  5 -1 -1 -1

最初我尝试对所有相等的列进行合并,然后减去带有后缀的列,但这似乎不像熊猫。此外,我只是通过复制所有相等而不是差异的列来手动进行合并。但是我不喜欢这种方法,因为我不会确保该程序是未来的证明,以防以后某个 df 中缺少一行,所以我不会进行某种内部合并。

这是我非常类似于 unpandas 的方法的代码。

import pandas as pd

df1 = pd.DataFrame(data = {'A':[0,1,2],'B':[3,4,5],'C':[8,1,2],'D':[7,1,2],'E':[6,3,4]})
df2 = pd.DataFrame(data = {'A':[0,1,2],'B':[3,4,5],'C':[1,2,3],'D':[5,4,3],'E':[6,4,5]})
df3 = df1.merge(df2, on=['A','B'])
all_columns = df1.columns.tolist()
shared_columns = ['A', 'B']
df4 = df1[shared_columns]
diff_columns = list(set(all_columns) - set(shared_columns))
df4[diff_columns] = df1[diff_columns] - df2[diff_columns]

df4 给了我想要的结果,但我对获得它们的方式不满意。

编辑:添加附加信息:对于列,是否复制值或减去它们应该是一致的。(就像对行的合并一样)

标签: pythonpython-3.xpandasdataframemerge

解决方案


用于where保持值相等的单元格,如果不是这种情况,则用两个数据帧的简单减法替换:

df1.where(df1.eq(df2), df1-df2)

输出:

   A  B  C  D  E
0  0  3  7  2  3
1  1  4 -1 -3 -1
2  2  5 -1 -1 -1

编辑:如果您不确定当值相等时该怎么做,您可以使用mask固定值或任何函数的输出替换:

df1.sub(df2).mask(df1.eq(df2), '=')

输出:

   A  B  C  D  E
0  =  =  7  2  3
1  =  = -1 -3 -1
2  =  = -1 -1 -1

推荐阅读