商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何用自定义函数将 DataFrame 中每列的 NaN 值替换为该列均值

如何用自定义函数将 DataFrame 中每列的 NaN 值替换为该列均值

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

在数据清洗的日常工作中,缺失值处理几乎是绕不开的一步。用列均值填充缺失值,算得上是最经典也最稳健的做法之一。虽然一行 df.apply(lambda x: x.fillna(x.mean())) 就能搞定,但真正放到生产环境或者团队协作中,把逻辑封装成可复用的函数,显然更能提升代码的可读性和可维护性。下面直接上两种专业级的实现方案,各自适用场景不同,可以按需选取。

方案一:批量填充所有数值列(推荐)

import pandas as pd
import numpy as np

def fill_nan_with_mean(df):
    """
    将 DataFrame 中所有数值列的 NaN 值替换为该列均值。
    自动跳过非数值列(如字符串、时间序列),避免报错。
    """
    # 计算每列均值(仅对数值列有效,自动忽略非数值列)
    column_means = df.select_dtypes(include=[np.number]).mean()
    # 原地填充(inplace=True),返回 None;若需链式调用,可改为 return df.fillna(column_means)
    df.fillna(column_means, inplace=True)
    return df  # 显式返回便于调试和链式操作

使用示例:

# 创建含 NaN 的测试数据
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5.0, np.nan, 7.0, 8.0],
    'C': ['x', 'y', 'z', 'w']  # 非数值列,将被自动忽略
})
print("原始数据:\n", df)
fill_nan_with_mean(df)
print("\n填充后:\n", df)

输出中列 'A' 的 NaN 被 2.33... 替代,列 'B' 的 NaN 被 6.66... 替代,而列 'C' 保持不变。整个过程自动过滤非数值列,不用担心报错,非常省心。

方案二:精确控制单列填充

def fill_nan_with_mean_single_column(df, column_name):
    """
    仅对指定列填充 NaN(要求列存在且为数值类型)。
    若列不存在或非数值,抛出清晰错误提示。
    """
    if column_name not in df.columns:
        raise ValueError(f"列 '{column_name}' 不存在于 DataFrame 中")
    if not pd.api.types.is_numeric_dtype(df[column_name]):
        raise TypeError(f"列 '{column_name}' 不是数值类型,无法计算均值")
    mean_val = df[column_name].mean()
    df[column_name].fillna(mean_val, inplace=True)
    return df

当你只需要对某几列做处理,或者不同列要采用不同的填充策略时,单列版本就派上用场了。注意这里做了类型校验和存在性检查,避免出现隐式错误。

关键注意事项

  • axis=1 是致命错误:原问题里有人试图用 df.apply(..., axis=1) 按行操作,但均值需要按列计算(axis=0),而且行上下文里调用 x.mean() 毫无意义,很容易踩坑。
  • 避免 if x is None 判断:Pandas 中的 NaN 不等于 Python 的 None,正确做法是使用 pd.isna() 或者直接信赖 fillna() 内置逻辑。
  • inplace=True 的权衡:原地修改确实节省内存,但不利于函数式编程和链式调用。如果代码需要频繁复用,建议返回新 DataFrame,即 return df.fillna(column_means),这样更安全。
  • 数据类型安全df.mean() 默认会跳过 NaN,但如果某列全是 NaN,均值会返回 NaN,此时 fillna() 就无效了。稳妥的做法是提前检查:df.isna().all(),或者对全空列做单独处理。

有了这两个函数,日常数据清洗中遇到缺失值填充,直接调用 fill_nan_with_mean(df) 就能获得清晰的业务语义,而且代码可复用、可维护,算是数据预处理流程里一个靠谱的基础组件。

本文转载于:https://www.php.cn/faq/2317993.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注