为MultiIndex DataFrame的Level 1按Level 0补全日历日期索引
解决MultiIndex DataFrame按Level 0补全日期索引的问题
我来帮你搞定这个需求!针对每个Level 0分组补全其对应的完整日期范围,用pandas的分组操作结合reindex就能轻松实现,下面一步步给你演示:
第一步:构造示例数据(方便你对照操作)
先模拟一个带有日期缺失的MultiIndex DataFrame:
import pandas as pd import numpy as np # 构造两组有缺失的日期序列 dates_group_a = pd.date_range('2023-01-01', '2023-01-05', freq='2D') # 缺2023-01-02、04 dates_group_b = pd.date_range('2023-01-03', '2023-01-07', freq='3D') # 缺2023-01-04、05、06 # 生成MultiIndex和DataFrame index = pd.MultiIndex.from_tuples( [('A', d) for d in dates_group_a] + [('B', d) for d in dates_group_b], names=['Level0', 'Level1'] ) df = pd.DataFrame({'value': np.random.randn(5)}, index=index)
第二步:核心补全逻辑
通过groupby按Level 0分组,对每个分组生成从最小日期到最大日期的完整日历序列,再用reindex补全行:
def fill_group_dates(group): # 获取当前分组的日期边界 min_date = group.index.min() max_date = group.index.max() # 生成完整日历日期序列 full_date_range = pd.date_range(min_date, max_date, freq='D') # 重新索引补全,缺失值默认用NaN填充 return group.reindex(full_date_range) # 分组应用补全函数,再整理索引格式 filled_df = df.groupby(level='Level0').apply(fill_group_dates) filled_df = filled_df.reset_index(level=0, drop=False).rename_axis(['Level0', 'Level1'])
可选:自定义缺失值填充规则
如果不想用NaN填充缺失值,可以修改reindex的参数,或者用填充方法:
- 用固定值(比如0)填充:
def fill_with_fixed_value(group): min_date = group.index.min() max_date = group.index.max() full_date_range = pd.date_range(min_date, max_date, freq='D') return group.reindex(full_date_range, fill_value=0)
- 前向填充(用上一个有效值填充):
def fill_with_ffill(group): min_date = group.index.min() max_date = group.index.max() full_date_range = pd.date_range(min_date, max_date, freq='D') return group.reindex(full_date_range).ffill()
验证结果
比如查看分组'A'的索引,就能看到已经补全了所有日历日期:
print(filled_df.loc['A'].index)
内容的提问来源于stack exchange,提问作者feetwet
相关产品推荐
相关产品推荐

