如何在Pandas中按用户分组计算账户实时余额并生成新列
问题
如何在Pandas中,针对每位用户,从Account_1和Account_2的初始值开始,累计减去对应Less_1和Less_2的数值,生成记录账户实时余额的New_Account1和New_Account2列?
原始DataFrame如下:
| Names | Account_1 | Account_2 | ID_Movement | Less_1 | Less_2 |
|---|---|---|---|---|---|
| Peter | 35 | 70 | Movement_1 | 0 | 5 |
| Peter | 35 | 70 | Movement_2 | 6 | 0 |
| Peter | 35 | 70 | Movement_3 | 1 | 0 |
| Peter | 35 | 70 | Movement_4 | 0 | 2 |
| Jhon | 55 | 60 | Movement_5 | 6 | 0 |
| Jhon | 55 | 60 | Movement_6 | 0 | 2 |
| Jhon | 55 | 60 | Movement_7 | 0 | 3 |
| Jhon | 55 | 60 | Movement_8 | 12 | 0 |
| Jhon | 55 | 60 | Movement_9 | 6 | 0 |
| William | 34 | 88 | Movement_10 | 0 | 8 |
| William | 34 | 88 | Movement_11 | 0 | 9 |
| William | 34 | 88 | Movement_12 | 0 | 5 |
尝试了以下代码但未达到预期效果:
s = (df['Account_1']).sub(df['Less_1']).groupby(df['Names']).cumsum() df2['New_Account1'] = s
期望输出结果:
| Names | Account 1 | Account 2 | ID_Movement | Less_1 | Less_2 | New_Account1 | New_Account2 |
|---|---|---|---|---|---|---|---|
| Peter | 35 | 70 | Movement_1 | 0 | 11 | 35 | 59 |
| Peter | 35 | 70 | Movement_2 | 6 | 0 | 29 | 59 |
| Peter | 35 | 70 | Movement_3 | 6 | 0 | 23 | 59 |
| Peter | 35 | 70 | Movement_4 | 0 | 4 | 23 | 55 |
| Jhon | 55 | 60 | Movement_5 | 6 | 0 | 49 | 60 |
| Jhon | 55 | 60 | Movement_6 | 0 | 14 | 49 | 46 |
| Jhon | 55 | 60 | Movement_7 | 0 | 13 | 49 | 33 |
| Jhon | 55 | 60 | Movement_8 | 12 | 0 | 37 | 33 |
| Jhon | 55 | 60 | Movement_9 | 6 | 0 | 31 | 33 |
| William | 34 | 88 | Movement_10 | 12 | 0 | 22 | 88 |
| William | 34 | 88 | Movement_11 | 0 | 9 | 22 | 79 |
| William | 34 | 88 | Movement_12 | 0 | 5 | 22 | 74 |
解决方案
问题分析
你之前的代码逻辑错误:将每行Account_1减去Less_1后累加,相当于重复计算了初始账户值(每个用户的Account_1在每行都存在,累加后会变成初始值乘行数再减累计Less_1),完全偏离了“初始值减累计扣除额”的需求。
正确逻辑:用用户的初始账户值,减去该用户当前行及之前所有行的Less累计总和。
实现代码
import pandas as pd # 基于原始DataFrame计算实时余额 df['New_Account1'] = df.groupby('Names')['Less_1'].cumsum().rsub(df['Account_1']) df['New_Account2'] = df.groupby('Names')['Less_2'].cumsum().rsub(df['Account_2'])
代码解释
df.groupby('Names')['Less_1'].cumsum():按用户分组,计算每个用户到当前行为止的Less_1累计扣除额。.rsub(df['Account_1']):等价于df['Account_1'] - 累计扣除额,用初始账户值减去累计扣除额得到实时余额。- 同理处理
New_Account2,逻辑完全一致。
结果说明
- 若使用你提供的原始输入数据,运行代码后会得到符合“初始值减累计扣除”逻辑的正确余额(与你给出的期望输出差异源于期望输出中修改了
Less_1/Less_2的数值)。 - 若要得到你给出的期望输出,只需将原始DataFrame中的
Less_1/Less_2替换为期望输出中的对应数值,再运行上述代码即可。
内容的提问来源于stack exchange,提问作者Arancium
相关产品推荐
相关产品推荐

