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

如何按Group Id计算DataFrame中近3个月交易笔数及金额总和?

按ID分组计算近三月累计交易笔数与金额

输入数据集

IdDateTransAmt
A2022-01-0210
A2022-01-0220
A2022-02-0430
A2022-02-0520
A2022-04-08300
A2022-04-11100
A2022-05-13200
A2022-06-1220
A2022-06-15300
A2022-08-16100

期望输出

IdDateTransAmtCountThreeMonthAmountThreeMonths
A2022-01-0210230
A2022-01-0220230
A2022-02-0430480
A2022-02-0520480
A2022-04-083004450
A2022-04-111004450
A2022-05-132003600
A2022-06-12205920
A2022-06-153005920
A2022-08-161003420

规则说明

  • 同一日期可存在多笔交易,例如2022-01-02有两笔交易;
  • 近3个月计算规则:当前月份交易总笔数+前两个月交易总笔数,金额计算逻辑相同,如1月仅2笔交易,无过往交易,故累计为2;
  • 需按每个Id分组进行计算。

实现代码(Pandas)

import pandas as pd

# 构造输入数据(实际场景可替换为读取文件逻辑)
df = pd.DataFrame({
    'Id': ['A']*10,
    'Date': ['2022-01-02', '2022-01-02', '2022-02-04', '2022-02-05', '2022-04-08',
             '2022-04-11', '2022-05-13', '2022-06-12', '2022-06-15', '2022-08-16'],
    'TransAmt': [10, 20, 30, 20, 300, 100, 200, 20, 300, 100]
})

# 转换日期格式并提取年月周期
df['Date'] = pd.to_datetime(df['Date'])
df['YearMonth'] = df['Date'].dt.to_period('M')

# 按ID和年月聚合,计算每月交易笔数与总金额
monthly_summary = df.groupby(['Id', 'YearMonth']).agg(
    monthly_count=('TransAmt', 'count'),
    monthly_amount=('TransAmt', 'sum')
).reset_index()

# 对每个ID计算近3个月的滚动累计值,最小窗口为1(不足3个月时取已有月份总和)
monthly_summary['CountThreeMonth'] = monthly_summary.groupby('Id')['monthly_count'].rolling(3, min_periods=1).sum().droplevel(0)
monthly_summary['AmountThreeMonths'] = monthly_summary.groupby('Id')['monthly_amount'].rolling(3, min_periods=1).sum().droplevel(0)

# 将累计值合并回原数据集,移除中间列并调整顺序
final_result = df.merge(
    monthly_summary[['Id', 'YearMonth', 'CountThreeMonth', 'AmountThreeMonths']],
    on=['Id', 'YearMonth'],
    how='left'
).drop('YearMonth', axis=1)[['Id', 'Date', 'TransAmt', 'CountThreeMonth', 'AmountThreeMonths']]

# 输出结果
print(final_result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:35:20