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

用均值或中位数填充数据集NaN后出现inf值的原因及解决方法

填充NaN后出现inf值的成因与解决办法

可能的成因

  • 原数据集已存在inf或-inf值:计算列的均值/中位数时,pandas会将inf纳入统计,导致最终的均值/中位数变成inf,用这个值填充NaN自然会得到inf。
  • 数值溢出:如果列的数据类型是float32这类精度较低的类型,当列中存在极大值时,计算均值可能超出类型的数值范围,直接变成inf。
  • 极端值干扰:列中存在异常大/小的数值,拉偏了均值,导致均值突破浮点型的上限成为inf(这种情况在float32中更常见)。

解决办法

1. 先清理现有inf值

在计算填充值之前,把数据里的inf和-inf全部替换成NaN,再进行填充操作:

import pandas as pd
import numpy as np

# 替换inf为NaN
df = df.replace([np.inf, -np.inf], np.nan)

# 用均值填充
df_filled = df.fillna(df.mean())
# 或者用中位数(更抗极端值)
# df_filled = df.fillna(df.median())

2. 升级数据类型避免溢出

如果是float32导致的溢出,把列转成float64类型:

# 单列转换
df['target_col'] = df['target_col'].astype('float64')
# 全列转换
df = df.astype('float64')

3. 用中位数替代均值

中位数不受极端值和inf的影响(前提是先把inf转成NaN),如果均值计算异常,换中位数填充更稳妥。

4. 截断极端值后再计算统计量

先对列中的极端值进行截断,再计算均值:

# 以列的1%和99%分位数为边界截断
lower = df['target_col'].quantile(0.01)
upper = df['target_col'].quantile(0.99)
clipped_col = df['target_col'].clip(lower=lower, upper=upper)
# 用截断后的均值填充
df['target_col'] = df['target_col'].fillna(clipped_col.mean())

5. 提前验证统计值

填充前先检查列的均值/中位数是否正常,避免用inf填充:

col_mean = df['target_col'].mean()
if np.isinf(col_mean):
    # 处理该列的inf或极端值问题
    df['target_col'] = df['target_col'].replace([np.inf, -np.inf], np.nan)
    col_mean = df['target_col'].mean()
df['target_col'] = df['target_col'].fillna(col_mean)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:57:34