用均值或中位数填充数据集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
相关产品推荐
相关产品推荐

