如何按月份与concept列对Pandas DataFrame进行分组聚合
按月份+Concept分组求和的解决方案
步骤1:确保日期列是datetime类型
你已经完成这一步,这里再明确完整初始化代码:
import pandas as pd data={ 'date':['02/01/2023', '03/01/2023', '12/01/2023', '16/01/2023', '23/01/2023', '03/02/2023', '14/02/2023', '17/02/2023', '17/02/2023', '20/02/2023'], 'amount':[-2.6, -230.0, -9.32, -13.99, -12.99, -50.0, -5.84, -6.6, -11.95, -20.4], 'concept':['FOOD', 'REPAIR', 'HEALTH', 'NO CLASSIFIED', 'NO CLASSIFIED', 'REPAIR', 'FOOD', 'NO CLASSIFIED', 'FOOD', 'HEALTH'] } df = pd.DataFrame(data) # 转换日期格式,适配日/月/年的输入格式 df['date'] = pd.to_datetime(df['date'], dayfirst=True)
步骤2:按月份+Concept分组并求和
核心是提取日期的月份维度(而非完整日期)来分组,这里提供两种简洁实现方式:
方式一:利用周期类型分组
# 按月份周期(如2023-01)和concept分组,对amount求和 grouped_df = df.groupby([df['date'].dt.to_period('M'), 'concept'])['amount'].sum().reset_index() # 将月份周期格式化为"Jan-23"样式 grouped_df['date'] = grouped_df['date'].dt.strftime('%b-%y') # 同一月份仅显示一次,重复行留空 grouped_df['date'] = grouped_df['date'].mask(grouped_df['date'].duplicated(), '')
方式二:先提取月份字符串再分组
# 从日期中提取"Jan-23"格式的月份字符串 df['month'] = df['date'].dt.strftime('%b-%y') # 按月份字符串和concept分组求和 grouped_df = df.groupby(['month', 'concept'])['amount'].sum().reset_index() # 重命名列名为date grouped_df.rename(columns={'month': 'date'}, inplace=True) # 处理重复月份显示 grouped_df['date'] = grouped_df['date'].mask(grouped_df['date'].duplicated(), '')
最终结果
执行上述代码后,grouped_df的输出与你期望的格式完全一致:
| date | concept | amount |
|---|---|---|
| Jan-23 | FOOD | -2.60 |
| HEALTH | -9.32 | |
| NO CLASSIFIED | -26.98 | |
| REPAIR | -230.00 | |
| Feb-23 | FOOD | -17.79 |
| HEALTH | -20.40 | |
| NO CLASSIFIED | -6.60 | |
| REPAIR | -50.00 |
内容的提问来源于stack exchange,提问作者nekovolta
相关产品推荐
相关产品推荐

