You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python DataFrame替换NaN值后仍显示NaN的问题求助

解决DataFrame中NaN值替换无效的问题

嘿,我刚看完你的代码,发现几个导致NaN替换失败的关键问题,咱们一步步来解决:

为什么你的代码没生效?

  • replace方法没修改原数据:pandas的replace默认返回新的DataFrame副本,不会改动原来的data。除非你加上inplace=True参数,或者把结果重新赋值给data
  • 手动循环遍历元素效率低还易出错:pandas是为向量化操作设计的,两层循环逐个检查元素的方式不仅慢,还容易因为索引问题踩坑。
  • math.isnan的局限性:如果列里有非数值类型数据(比如字符串),math.isnan会报错;处理pandas的NaN时,用pd.isna()会更稳妥。

正确的解决方法(推荐向量化操作)

直接用pandas内置的fillnamean方法,一行代码就能搞定所有数值列的NaN替换:

import pandas as pd

# 计算每列的数值均值,自动替换对应列的NaN
data = data.fillna(data.mean(numeric_only=True))
  • data.mean(numeric_only=True)会自动跳过非数值列,计算每列的均值;
  • fillna会把每列的NaN值替换成该列的均值,返回新的DataFrame,重新赋值给data就完成修改了。

如果需要针对特定列单独处理(比如某些列不适合用均值填充),可以这样写:

import pandas as pd
import statistics

for col in data.columns:
    # 只处理数值型列
    if pd.api.types.is_numeric_dtype(data[col]):
        # 先去掉NaN再计算均值
        col_mean = statistics.mean(data[col].dropna())
        # 直接替换该列的NaN
        data[col] = data[col].fillna(col_mean)

如果你想修改原代码让它生效(不推荐,但可理解问题)

如果一定要保留你的循环思路,需要调整两点:

import math
import statistics

for col in data.columns:
    # 先计算该列的均值(去掉NaN)
    col_mean = statistics.mean(data[col].dropna())
    # 对列中的每个元素判断替换,直接赋值回原列
    data[col] = data[col].apply(lambda x: col_mean if math.isnan(x) else x)

不过还是强烈建议用前面的向量化方法,速度快且代码更简洁。

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

火山引擎 最新活动