Pandas多列重采样分组:按地点、年月聚合分类与状态计数
解决Pandas按地点+年月统计分类与状态计数的问题
问题说明
需要将以下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({ 'date': [ '2019-08-01', '2019-12-01', '2019-23-01', '2019-15-01', '2020-26-02', '2020-10-10', '2020-08-10', '2021-01-04' ], 'loc': [ 'axp','axp', 'axp', 'axp', 'axe', 'axp', 'axp', 'axe' ], 'category': [ 'domestic', 'domestic', 'domestic', 'domestic', 'wild', 'domestic', 'domestic', 'wild' ], 'status': [ 'found', 'found', 'not found', 'found', 'found', 'found', 'found', 'not found' ] })
转换为按loc结合年月统计category和status计数的格式,目标格式如下:
| loc_mnth_yr | n_domestic | n_wild | n_found | n_not_found |
|---|---|---|---|---|
| axp_01_2019 | 4 | 0 | 3 | 1 |
| axe_02_2020 | 0 | 1 | 1 | 0 |
| axp_10_2020 | 2 | 0 | 2 | 0 |
| axe_04_2021 | 0 | 1 | 0 | 1 |
用户尝试了以下代码但未得到预期结果:
df = df.resample('M')['category'].value_counts().to_frame().rename({'category':'count'},axis=1) df = df.pivot_table(index='date', columns='category')
问题分析
用户代码存在以下问题:
- 未处理错误日期格式:原始
date列是年-日-月格式,直接使用resample会解析错误,且未将date设为索引。 - 缺失地点维度:没有按
loc分组统计,仅按日期重采样,忽略了地点的分组需求。 - 未覆盖状态统计:只处理了
category列,没有对status列进行计数。
解决方案
以下是完整的正确代码:
import pandas as pd # 1. 修复日期格式:原始date为年-日-月,指定format转换为datetime类型 df['date'] = pd.to_datetime(df['date'], format='%Y-%d-%m') # 2. 生成复合分组键:loc_月_年 df['loc_mnth_yr'] = df['loc'] + '_' + df['date'].dt.strftime('%m_%Y') # 3. 分别统计category和status的各类计数 # 对category做独热编码后按复合键求和 category_counts = pd.get_dummies(df['category'], prefix='n').groupby(df['loc_mnth_yr']).sum() # 对status做独热编码后按复合键求和 status_counts = pd.get_dummies(df['status'], prefix='n').groupby(df['loc_mnth_yr']).sum() # 4. 合并结果并调整列顺序 result = pd.concat([category_counts, status_counts], axis=1).reset_index() result = result[['loc_mnth_yr', 'n_domestic', 'n_wild', 'n_found', 'n_not_found']] print(result)
运行结果
loc_mnth_yr n_domestic n_wild n_found n_not_found 0 axp_01_2019 4 0 3 1 1 axp_10_2020 2 0 2 0 2 axe_02_2020 0 1 1 0 3 axe_04_2021 0 1 0 1
内容的提问来源于stack exchange,提问作者emmasa
相关产品推荐
相关产品推荐

