我有两个熊猫数据框。
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,反之亦然。
不确定我是否描述得足够充分。
答案 0 :(得分:3)
将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