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.
相关产品推荐
相关产品推荐

