我的数据框如下:
Person Payment_Type Amount Place
Adam C 500 X
Adam D 200 X
Adam C 80 Y
Adam D 30 Y
Bob C 100 Y
Bob D 20 Y
我想创建一个列Final_Payment
,以使它对每个人的每个位置都等于C-D
。例如:
Person Place Final_Payment
Adam X 300
Adam Y 50
Bob Y 80
现在,我尝试通过写以下内容来groupby
:{p}
sample=sample.groupby(['Place']).agg({'Amount':'sum'})
但这只为我提供了一个包含Places以及与之对应的所有金额之和的数据框。我知道这是错误的。
到目前为止,我提出的逻辑是:
for Person, Place in Dataframe
Final_Payment= Amount at C - Amount at D
end
老实说,我无法找到编码此部分的方法。我该如何针对每个地点和每个人到达最后一栏?在这一点上,我真的很沮丧。
我将非常感谢我能获得的任何帮助!
答案 0 :(得分:1)
您可以pivot
然后得到差异,然后根据需要重新命名:
m = df.pivot_table(index=['Person','Place'],columns='Payment_Type',values='Amount')
out = (m['C']-m['D']).rename('Final_Payment').reset_index()
print(out)
Person Place Final_Payment
0 Adam X 300.0
1 Adam Y 50.0
2 Bob Y 80.0
这是透视df的样子:
print(m)
Payment_Type C D
Person Place
Adam X 500 200
Y 80 30
Bob Y 100 20