给出以下两个数据框,如何创建第三个数据框,例如desired_output
?
对于df1
或{{1}中列出的每个成本中心,应显示df2
的成本中心金额与df1
的成本中心金额之差}(那么df2
的默认金额应为0)。
例如,df1
中的第一个金额是这样计算的:100-(50 + 150)= -100。
请注意,成本中心和金额列在每个df中的命名都不同。
desired_output
答案 0 :(得分:1)
您似乎希望每个数据帧groupby().sum()
,然后发现不同之处:
common_index = sorted(list(set(df.cost_center.unique()).union(set(df2.cc))))
sum1 = df.groupby('cost_center').amount.sum().reindex(common_index, fill_value=0)
sum2 = df2.groupby('cc').a.sum().reindex(common_index, fill_value=0)
sum1-sum2
给予:
cost_center
1 -100
2 700
3 300
4 250
5 1050
6 -350
7 -1200
dtype: int64
答案 1 :(得分:0)
当然不是唯一的解决方案,而是使用groupby().sum()
并合并数据帧,然后计算差异的选项:
df3 = (df.groupby('cost_center', as_index=False).sum()
.merge(df2.groupby('cc', as_index=False).sum(),
left_on='cost_center', right_on='cc', how='outer')
.fillna(0))
df3['diff'] = df3['amount'] - df3['a']
df3
cost_center amount cc a diff
0 1.0 100.0 1.0 200.0 -100.0
1 2.0 700.0 0.0 0.0 700.0
2 3.0 300.0 0.0 0.0 300.0
3 4.0 400.0 4.0 150.0 250.0
4 5.0 1300.0 5.0 250.0 1050.0
5 0.0 0.0 6.0 350.0 -350.0
6 0.0 0.0 7.0 1200.0 -1200.0
答案 2 :(得分:0)
考虑不同的方式
df2.columns=df.columns
pd.concat([df,df2.assign(amount=-df2.amount)]).groupby('cost_center').sum()
Out[234]:
amount
cost_center
1 -100
2 700
3 300
4 250
5 1050
6 -350
7 -1200