Pandas如何将列内负数、NaN和0替换为前后位置正数的平均值
Pandas 列无效值替换实现方案
核心逻辑说明
你需要的替换逻辑是逐列处理,将列中<=0、NaN的无效值,按前序已替换完成的有效值 + 后序最近原始有效正数取平均的规则递推替换,我们可以通过自定义列处理函数实现。
完整实现代码
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame({ 'a': [1, 2, 0, -3, -1, 3], 'c': [1, 2, 5, np.nan, 5, 3] }) def process_column(s: pd.Series) -> pd.Series: s = s.copy() # 标记无效值:NaN、小于等于0的值都算无效 invalid_mask = s.isna() | (s <= 0) # 提取所有有效正值的位置 valid_idx = s[~invalid_mask].index if len(valid_idx) == 0: # 整列无有效值的特殊情况,可按需修改返回逻辑 return s # 处理列开头的无效值:用第一个有效值填充 first_valid = valid_idx[0] s.loc[:first_valid - 1] = s.loc[first_valid] # 处理列结尾的无效值:用最后一个有效值填充 last_valid = valid_idx[-1] s.loc[last_valid + 1:] = s.loc[last_valid] # 处理中间的连续无效段 for i in range(len(valid_idx) - 1): left_valid = valid_idx[i] right_valid = valid_idx[i + 1] # 两个有效值相邻,中间无无效值,跳过 if right_valid - left_valid == 1: continue # 从左到右递推替换中间的无效值 for pos in range(left_valid + 1, right_valid): s.loc[pos] = (s.loc[pos - 1] + s.loc[right_valid]) / 2 return s # 对DataFrame的每一列应用处理函数 df = df.apply(process_column) print(df)
运行输出结果
a c 0 1.000 1 1 2.000 2 2 2.500 5 3 2.750 5 4 2.875 5 5 3.000 3
和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Suhas_Pote
相关产品推荐
相关产品推荐

