Pandas多索引重采样:如何保留其他索引信息?
Pandas多级索引下的重采样解决方案
场景一:按天重采样并求和
原始DataFrame
value A B 111 2024-03-22 00:00:00 1 111 2024-03-22 01:00:00 2 111 2024-03-22 02:00:00 3 222 2024-03-22 00:00:00 4 222 2024-03-22 01:00:00 5 222 2024-03-22 02:00:00 6
预期结果
value A B 111 2024-03-22 00:00:00 6 222 2024-03-22 00:00:00 15
实现代码
直接使用resample(level='B')会丢失非时间索引A,正确做法是先按索引A分组,再对每个组的时间索引B执行重采样操作,保留完整多级索引结构:
df.groupby(level='A').resample(level='B', freq='D').sum()
场景二:按小时重采样并补全缺失时间点(填充0)
原始DataFrame
value A B 111 2024-03-22 00:00:00 1 111 2024-03-22 01:00:00 2 111 2024-03-22 02:00:00 3 222 2024-03-22 00:00:00 4 222 2024-03-22 01:00:00 5 222 2024-03-22 02:00:00 6 333 2024-03-22 05:00:00 7
预期结果
value A B 111 2024-03-22 00:00:00 1 111 2024-03-22 01:00:00 2 111 2024-03-22 02:00:00 3 111 2024-03-22 03:00:00 0 111 2024-03-22 04:00:00 0 111 2024-03-22 05:00:00 0 222 2024-03-22 00:00:00 4 222 2024-03-22 01:00:00 5 222 2024-03-22 02:00:00 6 222 2024-03-22 03:00:00 0 222 2024-03-22 04:00:00 0 222 2024-03-22 05:00:00 0 333 2024-03-22 00:00:00 0 333 2024-03-22 01:00:00 0 333 2024-03-22 02:00:00 0 333 2024-03-22 03:00:00 0 333 2024-03-22 04:00:00 0 333 2024-03-22 05:00:00 7
实现代码
先构造包含所有A值和完整小时时间序列的多级索引,再通过reindex补全缺失项并填充0:
# 获取全局时间范围的完整小时序列 full_time = pd.date_range( start=df.index.get_level_values('B').min().floor('H'), end=df.index.get_level_values('B').max().floor('H'), freq='H' ) # 获取所有唯一的A值 unique_A = df.index.get_level_values('A').unique() # 构造完整的目标多级索引 full_index = pd.MultiIndex.from_product([unique_A, full_time], names=['A', 'B']) # 重采样补全并填充0 result = df.reindex(full_index, fill_value=0)
Pandas版本:2.0.1
内容的提问来源于stack exchange,提问作者OliverGras
相关产品推荐
相关产品推荐

