Pandas Grouper结合多分类列实现重采样与分组聚合
Pandas周度重采样+分组聚合实现代码
前置说明
首先需要确保DataFrame的时间索引为DatetimeIndex类型,否则重采样逻辑无法正常执行。
完整实现代码
import pandas as pd # -------------------------- # 若你已经有处理好的df,可跳过这段示例数据构造部分 # -------------------------- df = pd.DataFrame( [ ['A', 'X', 'P', 12.0, 15.0, 20.0], ['B', 'Z', 'Q', 42.0, 43.0, 67.0], ['C', 'Y', 'R', 80.0, 15.0, 40.0], ['B', 'Z', 'R', 15.0, 55.0, 30.0], ['A', 'X', 'P', 11.0, 20.0, 22.0], ['A', 'Z', 'Q', 13.0, 10.0, 30.0] ], index=pd.to_datetime([ '2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-06' ]), columns=['Cat1', 'Cat2', 'Cat3', 'Amount', 'Offset', 'Adjust'] ) # 定义聚合规则:分类列取分组首个值,数值列求和 agg_config = { 'Cat3': 'first', 'Amount': 'sum', 'Offset': 'sum', 'Adjust': 'sum' } # 执行周度重采样+分组聚合 # 注:默认'W'以周日为周截止日,示例中2018-01-06为周六,因此用'W-SAT'对齐示例输出的周节点 result = df.resample('W-SAT').groupby(['Cat1', 'Cat2']).agg(agg_config).sort_index()
结果说明
执行后得到的result为多层索引结构:
- 第一层索引为周度时间节点,和示例给出的
2018-01-06节点完全对齐 - 第二层、第三层索引为分组字段
Cat1、Cat2 - 列值完全符合要求:
Cat3取分组内第一条记录的取值,三个数值列为分组内所有记录的求和结果- 比如
A-X分组的计算结果为Cat3=P, Amount=23.0, Offset=35.0, Adjust=42.0,和示例完全匹配 - 你示例中
B-Z分组的Adjust值写为107.0属于笔误,实际计算结果为67.0+30.0=97.0
- 比如
可调参数说明
- 如果你的周度统计规则需要调整周起始/截止日,修改
resample()的频率参数即可,比如W-MON代表以周一为周截止日 - 如果有新增列:分类列就在
agg_config中添加'列名': 'first',数值列添加'列名': 'sum'即可 - 如果不需要多层索引展示,可在最后追加
.reset_index()将所有索引转为普通列
内容的提问来源于stack exchange,提问作者enterML
相关产品推荐
相关产品推荐

