python - 如何创建另一列,其中包含基于熊猫数据框中同一分类列的两个不同值的操作?
问题描述
我的数据框如下所示:
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
写下金额和地点:
sample=sample.groupby(['Place']).agg({'Amount':'sum'})
但这只会给我一个带有 Places 的数据框以及与之对应的所有 Amounts 的总和。我知道这是错误的。
到目前为止,我提出的逻辑是:
for Person, Place in Dataframe
Final_Payment= Amount at C - Amount at D
end
老实说,我想不出一种方法来编码这部分。我怎样才能到达针对每个地方和每个人的最后一列?在这一点上我真的很难过。
我真的很感激我能得到的任何帮助!
解决方案
您可以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
推荐阅读
- kubernetes - Kubernetes 中的 apiserver_request_duration_seconds prometheus 指标是什么意思?
- regex - Pentaho 中的正则表达式
- processing - 在球体上尝试曲线。似乎无法正确理解曲线的上升和下降
- google-app-engine - 在 App 引擎标准中安装二进制文件(gactions)
- built-in - 内置函数“highestbars”有错误吗?
- c# - 如何在 WFP C#.Net 中拆分相交标签?
- qt - 如何处理已弃用的 Qt3DRender::QBuffer::BufferType?
- wordpress - 如何使用多个变量更改 WooCommerce 中的“选择选项”文本
- git - Semantic-Release - 预发布版本不增加补丁、次要或主要版本
- r - 如何在 dplyr 中获取 case_when 接受字符的条件