Python 显示特定列上两个数据帧的差异
给定如下两个数据帧,如何创建第三个数据帧,如Python 显示特定列上两个数据帧的差异,python,pandas,Python,Pandas,给定如下两个数据帧,如何创建第三个数据帧,如所需的\u输出 对于df1或df2中列出的每个成本中心,df1中的成本中心金额与df2中的成本中心金额之间的差异(此时df1的默认金额应为0) 因此,例如,期望的_输出中的第一个量是这样计算的:100-(50+150)=-100 还请注意,成本中心和金额列在每个df中的名称不同 import pandas as pd d = { 'cost_center': [1, 2, 3, 4, 5, 2, 5, 5], 'amount': [1
所需的\u输出
对于df1
或df2
中列出的每个成本中心,df1
中的成本中心金额与df2
中的成本中心金额之间的差异(此时df1
的默认金额应为0)
因此,例如,期望的_输出中的第一个量是这样计算的:100-(50+150)=-100
还请注意,成本中心和金额列在每个df中的名称不同
import pandas as pd
d = {
'cost_center': [1, 2, 3, 4, 5, 2, 5, 5],
'amount': [100, 200, 300, 400, 500, 500, 500, 300],
}
d2 = {
'cc': [1, 4, 5, 6, 7, 1, 7],
'a': [50, 150, 250, 350, 450, 150, 750],
}
desired_output = {
'cost_center': [1, 2, 3, 4, 5, 6, 7],
'df_amount_minus_df2_amount': [-100, 700, 300, 250, 1050, -350, -1200],
}
df = pd.DataFrame(d)
df2 = pd.DataFrame(d2)
看起来您需要每个数据帧的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
当然不是唯一的解决方案,而是使用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
思考不同的方式
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
您是如何获得预期的产出的?你能解释一下成本中心1的例子吗?看看熊猫加入/合并特定列上的数据帧:@Erfan:对不起,对于CC 1,它应该是“-100”:100-(50+150)。在你的问题中添加逻辑。。