【问题标题】:Merge pandas dataframes diff of columns合并熊猫数据框的列差异
【发布时间】:2021-11-10 08:53:12
【问题描述】:

我有 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 为我提供了我想要的结果,但我对获得它们的方式不满意。

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

【问题讨论】:

    标签: python python-3.x pandas dataframe merge


    【解决方案1】:

    使用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
    

    【讨论】:

    • 这看起来比我想出的所有东西都要好得多。但是,我不确定它将如何处理偶然具有相同值的单元格。选择相同的值或取差异应该在列中保持一致。我基本上有很多列来描述数据点。 (功能)和两个设置下的测量值。其中我想有差异。 (标签)它们匹配的可能只有一个值或 2 个值,但我希望有一个 0 表示没有区别。
    • @TomS 如果你想在值相等时做一些不同的事情,我提供了一个替代方案
    • 我将 df2 更改为在“E”列中有一个值相同。我仍然想要整个专栏的差异。必须有一个基于列的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2020-08-17
    • 2013-09-26
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2021-08-19
    • 2019-10-24
    相关资源
    最近更新 更多