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

用列均值填充DataFrame中NaN值失败,求技术协助

问题:fillna结合列均值填充NaN值未生效

我已经尝试了所有能想到的方法,希望得到帮助!以下是一个用于返回DataFrame中经过缺失值插补的部分数据的函数,但使用fillna结合列均值填充NaN值的代码未生效,附上代码及问题截图:

from statistics import mean
from unicodedata import numeric


def imputation(df, columns_to_imputed):
    
    
    # Step 1: Get a part of dataframe using columns received as a parameter.
    import pandas as pd
    import numpy as np

    df.set_axis(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'], axis=1, inplace=True)#设置列名

    part_of_df = pd.DataFrame(df.filter(columns_to_imputed, axis=1))
    part_of_df = part_of_df.drop([0], axis=0)
   

    #Step 2: Change the zero values in the columns to np.nan
    part_of_df = part_of_df.replace('0', np.nan)

    # Step 3: Change the nan values to the mean of each attribute (column). 
                  #You can use the apply(), fillna() functions.

    part_of_df = part_of_df.fillna(part_of_df.mean(axis=0)) #####我在这行试了各种方法都没用,想把每个NaN值替换成所在列的均值..

    return part_of_df  ####我返回这个结果查看NaN是否被替换,但完全没变化...

问题截图


问题原因及解决办法

核心问题分析

  1. 数据类型不匹配:你用replace('0', np.nan)只替换了字符串类型的'0',但如果原始数据里的0是数值型(int/float),这行代码不会生效,NaN没被正确生成,后续填充自然没效果。
  2. 列类型为字符串导致均值计算失败:如果列是字符串类型,part_of_df.mean(axis=0)会返回NaN,用NaN填充NaN等于没操作。

修正后的代码

import pandas as pd
import numpy as np

def imputation(df, columns_to_imputed):
    # Step 1: 设置列名并提取目标列
    df.set_axis(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'], axis=1, inplace=True)
    part_of_df = df.filter(columns_to_imputed, axis=1).drop([0], axis=0)

    # Step 2: 统一处理0值为NaN
    # 先强制转换列类型为数值型,无法转换的异常值转为NaN
    part_of_df = part_of_df.apply(pd.to_numeric, errors='coerce')
    # 替换数值型0为NaN
    part_of_df = part_of_df.replace(0, np.nan)

    # Step 3: 用列均值填充NaN
    col_means = part_of_df.mean(axis=0)
    part_of_df = part_of_df.fillna(col_means)

    return part_of_df

关键修改点

  • 把import语句移到函数外部,避免每次调用重复导入模块。
  • 新增pd.to_numeric强制转换列类型,确保后续能正确计算均值,同时处理异常值。
  • 替换数值型0为NaN,覆盖了数值型、字符串型两种0值场景。
  • 单独计算列均值再填充,逻辑更清晰,也方便排查均值是否正确生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:45:43