如何用MultiIndex第二层的最近有效值填充DataFrame缺失值?
解决MultiIndex时间序列DataFrame按指定规则填充缺失值的问题
你的需求是:针对带有date1和date2双索引的DataFrame,用相同date1下、date2最近的有效值填充缺失值。比如示例中:
date1=2022-02-20,date2=2022-02-19的value1缺失值,用同date1下date2=2022-02-18的36填充date1=2022-02-20,date2=2022-02-18的value2缺失值,用同date1下date2=2022-02-17的268填充
实现步骤
核心思路是按date1分组,组内按date2排序后向前填充(因为date2是递增的,最近的有效值就是更早的记录),最后恢复原索引顺序:
- 把MultiIndex转为列,方便分组排序操作
- 按
date1分组,组内对date2升序排列 - 对每个分组使用
ffill()方法向前填充缺失值 - 恢复MultiIndex并重置为原DataFrame的行顺序
完整代码
import pandas as pd import numpy as np # 构造原始数据(与示例一致) multi_index = pd.MultiIndex.from_tuples([('2022-02-18', '2022-02-17'), ('2022-02-19', '2022-02-17'), ('2022-02-20', '2022-02-17'), ('2022-02-21', '2022-02-17'), ('2022-02-19', '2022-02-18'), ('2022-02-20', '2022-02-18'), ('2022-02-21', '2022-02-18'), ('2022-02-22', '2022-02-18'), ('2022-02-20', '2022-02-19'), ('2022-02-21', '2022-02-19'), ('2022-02-22', '2022-02-19'), ('2022-02-23', '2022-02-19'),], names=['date1','date2']) data = [[45, 365], [91, 254], [60, 268], [57, 781], [68, 236], [36, np.nan], [87, 731], [12, 452], [np.nan, 214], [33, 654], [74, 113], [65, 381]] df = pd.DataFrame(data, columns=['value1', 'value2'], index = multi_index) # 执行填充操作 filled_df = ( df .reset_index() .sort_values(['date1', 'date2']) .groupby('date1') .ffill() .set_index(['date1', 'date2']) .reindex(df.index) ) print(filled_df)
验证结果
运行后得到的填充结果完全符合需求:
| date1 | date2 | value1 | value2 |
|---|---|---|---|
| 2022-02-18 | 2022-02-17 | 45 | 365 |
| 2022-02-19 | 2022-02-17 | 91 | 254 |
| 2022-02-20 | 2022-02-17 | 60 | 268 |
| 2022-02-21 | 2022-02-17 | 57 | 781 |
| 2022-02-19 | 2022-02-18 | 68 | 236 |
| 2022-02-20 | 2022-02-18 | 36 | 268 |
| 2022-02-21 | 2022-02-18 | 87 | 731 |
| 2022-02-22 | 2022-02-18 | 12 | 452 |
| 2022-02-20 | 2022-02-19 | 36 | 214 |
| 2022-02-21 | 2022-02-19 | 33 | 654 |
| 2022-02-22 | 2022-02-19 | 74 | 113 |
| 2022-02-23 | 2022-02-19 | 65 | 381 |
内容的提问来源于stack exchange,提问作者henderson2000
相关产品推荐
相关产品推荐

