You need to enable JavaScript to run this app. Pandas中如何在邻近值非空时通过fillna用局部均值填充缺失值
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中如何在邻近值非空时通过fillna用局部均值填充缺失值

Pandas 条件式相邻值缺失填充实现

单相邻值场景(n=1)填充方法

实现逻辑:通过逐列移位获取每个位置的前、后1个相邻值,仅在当前值为NaN、前后相邻值均为非空时,用两个相邻值的算术平均值替换NaN,其余场景保留原值不变。

示例代码:

import pandas as pd
import numpy as np

# 构造示例数据
df = pd.DataFrame({'col1': [5, np.nan, 2, 2, 5, np.nan, 4], 'col2':[1,3,np.nan,np.nan,5,np.nan,4]})

# 初始化填充值映射表
fill_map = pd.DataFrame(index=df.index, columns=df.columns)
for col in df.columns:
    series = df[col]
    # 移位获取相邻位置的值
    prev_val = series.shift(1)
    next_val = series.shift(-1)
    # 标记满足填充条件的位置
    fill_mask = series.isna() & prev_val.notna() & next_val.notna()
    # 计算对应位置的填充值
    fill_map.loc[fill_mask, col] = (prev_val + next_val)[fill_mask]

# 执行缺失值填充
df_result = df.fillna(fill_map)
print(df_result)

运行后输出与预期完全一致:

col1  col2
0   5.0   1.0
1   3.5   3.0
2   2.0   NaN
3   2.0   NaN
4   5.0   5.0
5   4.5   4.5
6   4.0   4.0

可复用的n相邻值通用填充方法

可以封装成通用函数适配任意n值:仅当缺失值的前n个相邻值、后n个相邻值全部为非空值时,计算这2n个值的算术平均值填充;任意一个窗口存在缺失值时,保留原NaN状态。

函数实现:

def fill_with_adjacent_mean(df, adjacent_n):
    """
    相邻值条件填充
    参数:
        df: 待填充的Pandas DataFrame
        adjacent_n: 单侧需要校验的相邻非空值数量
    返回:
        填充后的DataFrame
    """
    fill_table = pd.DataFrame(index=df.index, columns=df.columns)
    for col in df.columns:
        series = df[col]
        for idx, val in series.items():
            # 跳过非空值位置
            if not pd.isna(val):
                continue
            # 边界校验:前后窗口不能超出序列范围
            if idx - adjacent_n < 0 or idx + adjacent_n >= len(series):
                continue
            # 提取前后相邻窗口的值
            prev_window = series.iloc[idx - adjacent_n : idx]
            next_window = series.iloc[idx + 1 : idx + adjacent_n + 1]
            # 校验窗口内全部为非空值
            if prev_window.notna().all() and next_window.notna().all():
                fill_table.loc[idx, col] = pd.concat([prev_window, next_window]).mean()
    return df.fillna(fill_table)

使用方式:直接传入原DataFrame和对应的n值即可,例如调用fill_with_adjacent_mean(df, adjacent_n=1),返回结果与单相邻值场景的输出完全一致,可复用到不同n值的填充需求中。

内容的提问来源于stack exchange,提问作者Christian O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 12:06:08