用列均值填充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是否被替换,但完全没变化...

问题原因及解决办法
核心问题分析
- 数据类型不匹配:你用
replace('0', np.nan)只替换了字符串类型的'0',但如果原始数据里的0是数值型(int/float),这行代码不会生效,NaN没被正确生成,后续填充自然没效果。 - 列类型为字符串导致均值计算失败:如果列是字符串类型,
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
相关产品推荐
相关产品推荐

