如何基于多个列从另一个数据框中减去另一个数据框中的值?

时间:2020-06-09 05:03:35

标签: python pandas dataframe

我有两个熊猫数据框。

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,反之亦然。

不确定我是否描述得足够充分。

1 个答案:

答案 0 :(得分:3)

Series.subfill_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