我有两个 pandas 数据框。
import pandas as pd
data1 = {'id1': [625,625,725,625,725,1130,625,1130,725,1130],
'id2': ['AF','AG','AF','AP','AP','BM','BA','BC','BM','AF'],
'Total': [75,68,33,77,42,25,113,80,72,36]}
df1 = pd.DataFrame(data1, columns = ['id1','id2','Total'])
data2 = {'id1': [625,725,625,625,1130,1130,625,725,1130,625],
'id2': ['AF','AF','AG','AP','AF','AG','BA','BA','BM','BM'],
'Part1': [5,8,3,4,2,6,1,2,6,3]}
df2 = pd.DataFrame(data2, columns = ['id1','id2','Part1'])
我得到了这两个数据框。
df1 id1 id2 Total
0 625 AF 75
1 625 AG 68
2 725 AF 33
3 625 AP 77
4 725 AP 42
5 1130 BM 25
6 625 BA 113
7 1130 BC 80
8 725 BM 72
9 1130 AF 36
df2 id1 id2 Part1
0 625 AF 5
1 725 AF 8
2 625 AG 3
3 625 AP 4
4 1130 AF 2
5 1130 AG 6
6 625 BA 1
7 725 BA 2
8 1130 BM 6
9 625 BM 3
我想要的是创建第三个数据框,在其中保留 id1 和 id2 的每个唯一组合,同时从 df1 中的“总计”中减去 df2 中“Part1”列中的值,假设每个 id1 和 id2 组合只出现在任一数据帧中一次。
例如: “625”和“AF”的组合在 df1 中给出值 75,在 df2 中给出值 5。我想要的是创建第三个数据框,其中一行在三列中包含“625”、“AF”和“70”。
如果一个组合出现在 df1 中但没有出现在 df2 中,我们将其视为存在于 df2 中但值为 0,反之亦然。
不确定我的描述是否充分。
最佳答案
使用Series.sub
使用 fill_value=0
参数进行减法,并将列 id1, id2
转换为 MultiIndex
,因此减法基于这些列:
df = (df1.set_index(['id1','id2'])['Total']
.sub(df2.set_index(['id1','id2'])['Part1'], fill_value=0)
.reset_index(name='new'))
print (df)
id1 id2 new
0 625 AF 70.0
1 625 AG 65.0
2 625 AP 73.0
3 625 BA 112.0
4 625 BM -3.0
5 725 AF 25.0
6 725 AP 42.0
7 725 BA -2.0
8 725 BM 72.0
9 1130 AF 34.0
10 1130 AG -6.0
11 1130 BC 80.0
12 1130 BM 19.0
关于python - 如何根据多列从一个数据帧中减去另一个数据帧中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62275371/