You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按用户分组计算账户实时余额并生成新列

问题

如何在Pandas中,针对每位用户,从Account_1和Account_2的初始值开始,累计减去对应Less_1和Less_2的数值,生成记录账户实时余额的New_Account1和New_Account2列?

原始DataFrame如下:

NamesAccount_1Account_2ID_MovementLess_1Less_2
Peter3570Movement_105
Peter3570Movement_260
Peter3570Movement_310
Peter3570Movement_402
Jhon5560Movement_560
Jhon5560Movement_602
Jhon5560Movement_703
Jhon5560Movement_8120
Jhon5560Movement_960
William3488Movement_1008
William3488Movement_1109
William3488Movement_1205

尝试了以下代码但未达到预期效果:

s = (df['Account_1']).sub(df['Less_1']).groupby(df['Names']).cumsum()
df2['New_Account1'] = s

期望输出结果:

NamesAccount 1Account 2ID_MovementLess_1Less_2New_Account1New_Account2
Peter3570Movement_10113559
Peter3570Movement_2602959
Peter3570Movement_3602359
Peter3570Movement_4042355
Jhon5560Movement_5604960
Jhon5560Movement_60144946
Jhon5560Movement_70134933
Jhon5560Movement_81203733
Jhon5560Movement_9603133
William3488Movement_101202288
William3488Movement_11092279
William3488Movement_12052274
解决方案

问题分析

你之前的代码逻辑错误:将每行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'])

代码解释

  1. df.groupby('Names')['Less_1'].cumsum():按用户分组,计算每个用户到当前行为止的Less_1累计扣除额。
  2. .rsub(df['Account_1']):等价于df['Account_1'] - 累计扣除额,用初始账户值减去累计扣除额得到实时余额。
  3. 同理处理New_Account2,逻辑完全一致。

结果说明

  • 若使用你提供的原始输入数据,运行代码后会得到符合“初始值减累计扣除”逻辑的正确余额(与你给出的期望输出差异源于期望输出中修改了Less_1/Less_2的数值)。
  • 若要得到你给出的期望输出,只需将原始DataFrame中的Less_1/Less_2替换为期望输出中的对应数值,再运行上述代码即可。

内容的提问来源于stack exchange,提问作者Arancium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:55:19