带二级列多层索引的Pandas DataFrame重采样聚合报错求助
问题:带DatetimeIndex和多层列索引的DataFrame时间重采样及列自定义聚合
我有一个Pandas DataFrame,行索引是一级DatetimeIndex,列是二级MultiIndex。尝试按5分钟频率对时间索引重采样,同时为不同二级列指定不同聚合函数,写了如下代码:
df.groupby([Grouper(freq="5Min"), df.columns.unique(level=1)]).agg({"sub_col_0_name": "min", "sub_col_1_name": "max", "sub_col_2_name": "mean", "sub_col_3_name": "std"})
运行时触发错误:
ValueError: Grouper and axis must be same length
请问如何正确实现需求?
解决方案
错误原因
你代码里的错误是:将列的二级索引唯一值列表df.columns.unique(level=1)加入了groupby分组器,但这个列表的长度(等于二级列的数量)和DataFrame的行数不匹配。groupby默认按行方向分组,分组器的长度必须和行数一致,因此触发长度不匹配的报错。
正确实现方式
以下两种方法都可以实现需求,推荐使用第一种更直观的resample方式:
方法1:使用resample + 聚合字典
直接对DatetimeIndex执行重采样,通过字典指定二级列对应的聚合函数:
import pandas as pd import numpy as np # 构造示例数据(可替换为你的实际数据) dates = pd.date_range('2024-01-01', periods=10, freq='1Min') cols = pd.MultiIndex.from_product( [['main_col'], ['sub_col_0_name', 'sub_col_1_name', 'sub_col_2_name', 'sub_col_3_name']], names=['level0', 'level1'] ) df = pd.DataFrame(np.random.randn(10,4), index=dates, columns=cols) # 定义聚合规则:键为二级列名,值为聚合函数 agg_rules = { 'sub_col_0_name': 'min', 'sub_col_1_name': 'max', 'sub_col_2_name': 'mean', 'sub_col_3_name': 'std' } # 执行重采样和聚合 resampled_df = df.resample('5Min').agg(agg_rules)
执行后会保留原有的多层列索引,且每个二级列按指定函数完成5分钟聚合。
方法2:使用groupby + Grouper
如果必须用groupby,只需保留时间分组器,移除列索引相关的分组项,直接通过聚合字典指定列规则:
from pandas import Grouper resampled_df = df.groupby(Grouper(freq='5Min')).agg(agg_rules)
这种方式和resample效果一致,本质上resample是groupby针对时间索引的语法糖。
内容的提问来源于stack exchange,提问作者ilpomo
相关产品推荐
相关产品推荐

