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

使用pandas fillna(中位数)填充DataFrame后仍存在NaN值的原因

搞定pandas fillna失效的问题:从你的场景说起

嘿,我来帮你拆解这个问题——你遇到的情况其实是pandas里常见的「缺失值类型不匹配+特征类型混淆」的问题,咱们一步步理清楚:

核心原因:你的"NA"不是真·NaN,且特征类型不对

你提到的GarageFinish这类字段的"NA",是字符串类型的标记,不是pandas默认识别的浮点型np.nan。这就导致了两个看似矛盾的现象:

  1. isnull()能识别它为缺失值——因为pandas的isnull()会把字符串"NA"/"NaN"也当作缺失处理;
  2. fillna(TT_df.median())对它无效——因为GarageFinish是分类特征(字符串类型),中位数是数值特征的统计量,pandas根本不会计算它的中位数,自然拿不到填充值。

而LotFrontage能被正常填充,恰恰是因为它是数值型特征,缺失值是真正的np.nan,中位数计算有效。

先验证你的猜想:确认缺失值类型和特征类型

先跑两段代码确认一下:

# 查看未填充特征的数据类型
print(TT_df[["GarageFinish", "你其他有问题的列名"]].dtypes)
# 查看这些列的唯一值,确认是不是字符串"NA"
print(TT_df["GarageFinish"].unique())

如果输出里dtype是object,且unique()结果里有'NA'字符串,那咱们的判断就完全坐实了。

分场景解决问题

1. 分类特征:用众数或业务值填充

像GarageFinish这种分类字段,用中位数填充本身就不合理,应该用众数(出现次数最多的类别)或者业务定义的明确值(比如你提到的"No Garage"):

# 方案A:用众数填充
TT_df["GarageFinish"] = TT_df["GarageFinish"].fillna(TT_df["GarageFinish"].mode()[0])

# 方案B:直接替换成业务含义明确的字符串
TT_df["GarageFinish"] = TT_df["GarageFinish"].replace("NA", "No Garage")

2. 统一处理所有缺失值:先转成标准NaN

如果你的数据里混合了字符串"NA"和真正的np.nan,可以先把所有缺失标记统一转成标准NaN,再分类型处理:

import numpy as np

# 把所有字符串型的缺失标记转成np.nan
TT_df = TT_df.replace(["NA", "na", "NaN"], np.nan)

# 数值特征用中位数填充
numeric_cols = TT_df.select_dtypes(include=[np.number]).columns
TT_df[numeric_cols] = TT_df[numeric_cols].fillna(TT_df[numeric_cols].median())

# 分类特征用众数填充
categorical_cols = TT_df.select_dtypes(include=["object"]).columns
TT_df[categorical_cols] = TT_df[categorical_cols].fillna(TT_df[categorical_cols].mode().iloc[0])

3. 从源头解决:读取数据时就指定缺失值标记

如果是从CSV/Excel读取数据,直接在读取阶段告诉pandas哪些字符串是缺失值,省得后续麻烦:

TT_df = pd.read_csv("你的数据文件.csv", na_values=["NA", "na"])

这样pandas会自动把这些字符串转成np.nan,后续的填充操作就能正常识别了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:57