You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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是递增的,最近的有效值就是更早的记录),最后恢复原索引顺序:

  1. 把MultiIndex转为列,方便分组排序操作
  2. 按date1分组,组内对date2升序排列
  3. 对每个分组使用ffill()方法向前填充缺失值
  4. 恢复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)

验证结果

运行后得到的填充结果完全符合需求:

date1date2value1value2
2022-02-182022-02-1745365
2022-02-192022-02-1791254
2022-02-202022-02-1760268
2022-02-212022-02-1757781
2022-02-192022-02-1868236
2022-02-202022-02-1836268
2022-02-212022-02-1887731
2022-02-222022-02-1812452
2022-02-202022-02-1936214
2022-02-212022-02-1933654
2022-02-222022-02-1974113
2022-02-232022-02-1965381

内容的提问来源于stack exchange,提问作者henderson2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:55:51