基于add/sub操作记录,用Pandas计算总余额及分团队余额
问题背景
我有一个名为df的DataFrame,包含type、timestamp、value和team列。type的取值为add(增加金额)或sub(扣除金额),记录了针对特定团队的收支情况。我希望计算所有团队的总支出余额,以及各团队的单独余额。例如,我可能周一向团队A支付X,周二收回X,周五再向团队A支付Y。请问有没有简洁的Pandas实现方法?
数据示例:
| Type | Timestamp | Value | Team |
|---|---|---|---|
| add | 1675971432 | 20 | A |
| add | 1675971392 | 50 | C |
| sub | 1675877813 | 15 | A |
| add | 1675877579 | 10 | D |
| add | 1675877528 | 20 | B |
| add | 1675877128 | 15 | A |
简洁实现方案
核心逻辑是先给收支金额赋予正负符号,再通过分组求和得到各团队余额,最后汇总总余额。
1. 生成带符号的收支金额
用np.where区分add和sub类型,给sub的金额加上负号:
import pandas as pd import numpy as np df['signed_value'] = np.where(df['type'] == 'add', df['value'], -df['value'])
2. 计算各团队单独余额
按team分组后对带符号的金额求和:
team_balances = df.groupby('team')['signed_value'].sum().reset_index(name='balance')
对示例数据执行后,团队A的余额为20 -15 +15 = 20,结果如下:
| Team | balance |
|---|---|
| A | 20 |
| B | 20 |
| C | 50 |
| D | 10 |
3. 计算所有团队总余额
直接对带符号金额列求和,或从团队余额汇总:
total_balance = df['signed_value'].sum() # 等价写法:total_balance = team_balances['balance'].sum()
示例数据的总余额为20+20+50+10=100。
一行紧凑写法
如果追求代码简洁,可以合并步骤:
# 各团队余额 team_balances = df.assign(signed_value=np.where(df['type']=='add', df['value'], -df['value']))\ .groupby('team')['signed_value'].sum().reset_index(name='balance') # 总余额 total_balance = team_balances['balance'].sum()
内容的提问来源于stack exchange,提问作者Ziva
相关产品推荐
相关产品推荐

