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

如何无需新建列,用前n行均值/中位数填充时间序列NA值?

无需新建列填充时间序列NA值的方案

嘿,我完全理解你不想额外创建中间列来填充NA值的需求——其实不用新建列也能轻松实现,而且有几种实用的方法可选,我给你详细梳理下:

1. 最简洁的向量式方案(推荐)

直接利用fillna()方法,把滚动均值/中位数的计算结果作为填充值传入,一步到位修改原列,完全不需要中间列:

# 用含当前行在内的6行(即前5天+当前行)的均值填充NA,和你原逻辑一致
ens['vol'] = ens['vol'].fillna(ens['vol'].rolling(6, min_periods=2).mean())

# 如果需要严格取**当前行之前的5天**(不含当前行),可以调整窗口参数:
ens['vol'] = ens['vol'].fillna(ens['vol'].rolling(window=5, min_periods=2, closed='left').mean())

如果想用中位数填充,只需要把.mean()换成.median()即可,逻辑完全通用。这种方法是pandas的向量操作,效率极高,适合处理大规模数据集。

2. 用apply实现自定义逻辑(适合复杂场景)

如果你需要更灵活的填充规则(比如动态调整窗口范围、加入额外判断),可以用apply逐行处理。不过要注意,这种方法是逐行遍历,大数据集下效率会比向量操作低一些:

import pandas as pd

def fill_na_with_rolling_stat(row, df, col, window=5, min_periods=2, stat_type='mean'):
    # 如果当前值是NA,计算前window行的统计量
    if pd.isna(row[col]):
        # 确定窗口的起始索引,避免越界
        start_idx = max(0, row.name - window)
        # 提取当前行之前的window行数据
        window_data = df.loc[start_idx:row.name-1, col].dropna()
        # 根据指定类型计算统计量
        if len(window_data) >= min_periods:
            if stat_type == 'mean':
                return window_data.mean()
            elif stat_type == 'median':
                return window_data.median()
        # 不满足最小样本数时返回原NA值(可根据需求调整)
        return row[col]
    # 非NA值直接返回
    else:
        return row[col]

# 应用函数,用前5天的均值填充NA
ens['vol'] = ens.apply(fill_na_with_rolling_stat, axis=1, df=ens, col='vol', window=5, min_periods=2)

# 换成中位数的话只需修改stat_type参数
# ens['vol'] = ens.apply(fill_na_with_rolling_stat, axis=1, df=ens, col='vol', window=5, min_periods=2, stat_type='median')

这个方法的优势是可以自定义任何你需要的填充逻辑,比如根据日期间隔调整窗口,或者加入其他列的条件判断。

两种方案对比

  • 向量式方案:速度快、代码简洁,适合常规的滚动填充需求,优先推荐。
  • apply方案:灵活性高,但效率较低,适合复杂的自定义填充场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:09:12