如何按Group Id计算DataFrame中近3个月交易笔数及金额总和?
按ID分组计算近三月累计交易笔数与金额
输入数据集
| Id | Date | TransAmt |
|---|---|---|
| A | 2022-01-02 | 10 |
| A | 2022-01-02 | 20 |
| A | 2022-02-04 | 30 |
| A | 2022-02-05 | 20 |
| A | 2022-04-08 | 300 |
| A | 2022-04-11 | 100 |
| A | 2022-05-13 | 200 |
| A | 2022-06-12 | 20 |
| A | 2022-06-15 | 300 |
| A | 2022-08-16 | 100 |
期望输出
| Id | Date | TransAmt | CountThreeMonth | AmountThreeMonths |
|---|---|---|---|---|
| A | 2022-01-02 | 10 | 2 | 30 |
| A | 2022-01-02 | 20 | 2 | 30 |
| A | 2022-02-04 | 30 | 4 | 80 |
| A | 2022-02-05 | 20 | 4 | 80 |
| A | 2022-04-08 | 300 | 4 | 450 |
| A | 2022-04-11 | 100 | 4 | 450 |
| A | 2022-05-13 | 200 | 3 | 600 |
| A | 2022-06-12 | 20 | 5 | 920 |
| A | 2022-06-15 | 300 | 5 | 920 |
| A | 2022-08-16 | 100 | 3 | 420 |
规则说明
- 同一日期可存在多笔交易,例如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
相关产品推荐
相关产品推荐

