如何使用Pandas按月份分组交易数据并计算月度差值
交易数据按月分组并计算相邻月份差值的完整实现方案
需求说明
- 将交易数据按年月分桶(如2023-03、2023-04、2023-05)
- 计算相邻月份间的交易金额差值(支持两种场景:单用户月度差值、全量用户月度总金额差值)
场景1:计算每个用户的相邻月份交易金额差值
完整代码实现
import pandas as pd # 构造示例数据集 data = { 'Trans ID': [1,1,1,2,2,2,3,3,3], 'Trans Amount': [50,600,40,500,500,10,980,1800,35], 'Trans Date': ['2023-03-31','2023-04-30','2023-05-31','2023-03-31','2023-04-30','2023-05-31','2023-03-31','2023-04-30','2023-05-31'] } df = pd.DataFrame(data) # 1. 日期预处理:转换为日期格式并提取年月 df['Year-Month'] = pd.to_datetime(df['Trans Date']).dt.strftime('%Y-%m') # 2. 按用户ID和年月排序,确保时间顺序正确 df = df.sort_values(by=['Trans ID', 'Year-Month']).reset_index(drop=True) # 3. 计算每个用户的相邻月份交易金额差值 df['Month-over-Month Difference'] = df.groupby('Trans ID')['Trans Amount'].diff() # 查看结果 print(df)
输出结果
| Trans ID | Trans Amount | Trans Date | Year-Month | Month-over-Month Difference | |
|---|---|---|---|---|---|
| 0 | 1 | 50 | 2023-03-31 | 2023-03 | NaN |
| 1 | 1 | 600 | 2023-04-30 | 2023-04 | 550.0 |
| 2 | 1 | 40 | 2023-05-31 | 2023-05 | -560.0 |
| 3 | 2 | 500 | 2023-03-31 | 2023-03 | NaN |
| 4 | 2 | 500 | 2023-04-30 | 2023-04 | 0.0 |
| 5 | 2 | 10 | 2023-05-31 | 2023-05 | -490.0 |
| 6 | 3 | 980 | 2023-03-31 | 2023-03 | NaN |
| 7 | 3 | 1800 | 2023-04-30 | 2023-04 | 820.0 |
| 8 | 3 | 35 | 2023-05-31 | 2023-05 | -1765.0 |
场景2:计算全量用户月度总金额的相邻月份差值
完整代码实现
import pandas as pd # 构造示例数据集(同上) data = { 'Trans ID': [1,1,1,2,2,2,3,3,3], 'Trans Amount': [50,600,40,500,500,10,980,1800,35], 'Trans Date': ['2023-03-31','2023-04-30','2023-05-31','2023-03-31','2023-04-30','2023-05-31','2023-03-31','2023-04-30','2023-05-31'] } df = pd.DataFrame(data) # 1. 日期预处理:转换为日期格式并提取年月 df['Year-Month'] = pd.to_datetime(df['Trans Date']).dt.strftime('%Y-%m') # 2. 按月分组计算总交易金额 monthly_total = df.groupby('Year-Month')['Trans Amount'].sum().reset_index() # 3. 按年月排序,确保时间顺序正确 monthly_total = monthly_total.sort_values('Year-Month').reset_index(drop=True) # 4. 计算相邻月份总金额差值 monthly_total['Month-over-Month Difference'] = monthly_total['Trans Amount'].diff() # 查看结果 print(monthly_total)
输出结果
| Year-Month | Trans Amount | Month-over-Month Difference | |
|---|---|---|---|
| 0 | 2023-03 | 1530 | NaN |
| 1 | 2023-04 | 2900 | 1370.0 |
| 2 | 2023-05 | 85 | -2815.0 |
对原代码的说明
你之前写的字典推导式d = {x : y for x, y in df.groupby(pd.to_date(df.Trans_Date).dt.strftime('%y-%m'))}会把每个分组的DataFrame存入字典,这种方式后续处理差值会比较繁琐。推荐直接使用pandas的groupby+diff()方法,一步到位完成差值计算,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Mbalenhle
相关产品推荐
相关产品推荐

