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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:24:04