如何用自定义Python函数将DataFrame列中NaN值替换为列均值?
问题修正方案
你的自定义函数无法正常运行的核心问题有三个,对应修正如下:
核心错误点
- 处理方向错误:
apply传入axis=1是按行处理,但我们需要按列计算均值并填充,应该改为axis=0。 - NaN判断逻辑错误:Pandas中的NaN是特殊浮点值,不能用
x is None识别,必须用pd.isna()或np.isnan()判断单个元素。 - 函数逻辑偏差:原函数把整列/整行当成单个元素判断,没有针对每个NaN值执行替换操作。
修正后的自定义函数实现
方案一:遍历元素处理
import pandas as pd import numpy as np def fill_col_with_mean(col): # 提前计算当前列的均值,避免重复计算 col_mean = col.mean() # 遍历列内每个元素,替换NaN为列均值 return [col_mean if pd.isna(val) else val for val in col] # 按列应用自定义函数 df2 = df.apply(fill_col_with_mean, axis=0)
方案二:结合Pandas内置方法(更简洁)
如果想保留自定义函数的形式,也可以直接在函数内调用fillna,逻辑和你找到的简洁方案一致:
def fill_col_with_mean(col): return col.fillna(col.mean()) df2 = df.apply(fill_col_with_mean, axis=0)
为什么原代码无效?
- 当使用
axis=1时,apply会把每一行作为Series传入my_func,此时x is None永远为False,直接返回原行,完全没处理NaN。 - 即使改成
axis=0,x是整列的Series,x is None仍然不成立,函数直接返回原列,没有执行替换逻辑。 - Pandas中的NaN不等于
None,必须用专门的检测函数才能识别。
内容的提问来源于stack exchange,提问作者Jekaterina Truskina
相关产品推荐
相关产品推荐

