python - 合并熊猫数据框的列差异
问题描述
我有 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 给了我想要的结果,但我对获得它们的方式不满意。
编辑:添加附加信息:对于列,是否复制值或减去它们应该是一致的。(就像对行的合并一样)
解决方案
用于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
推荐阅读
- python - 将我自己的文件命名为与模块相同的名称后无法导入 Python 模块
- php - Laravel 5.5 通过 gmail 发送电子邮件,从数据库配置
- c++ - 在代码中读取 FILEVERSION 值
- .net - 使用自定义比较设置 ListBox.SelectedItem
- c# - 在实体框架、Webforms 中指定多对多关系
- javascript - 渲染与预渲染 javascript canvas HTML5
- javascript - Qualtrics:选择选项时嵌入数据
- docker - 无法使用领事部署 traefik
- c# - CheckBoxFor - 无法将 lambda 表达式转换为预期的委托类型
- c - printf() 的格式字符串参数后“+1”的效果