Python自定义缺失值填充函数问题:均值/中位数/众数填充未达预期
Python缺失值自定义填充函数修复方案
常见问题原因
- 偏态判断阈值设置不合理,未明确偏态判定标准
- 数值/分类列识别错误,混淆了不同数据类型的列
- 众数计算未处理多众数场景,导致赋值失败
- 函数未返回处理后的数据集或直接修改原数据引发异常
修正后的自定义填充函数
import pandas as pd import numpy as np from scipy.stats import skew def fill_missing_values(df): # 复制原数据,避免修改原始数据集 df_filled = df.copy() # 精准分离数值列与分类列 numeric_cols = df_filled.select_dtypes(include=['int64', 'float64']).columns categorical_cols = df_filled.select_dtypes(include=['object', 'category']).columns # 处理数值列:按偏态选择填充方式 for col in numeric_cols: # 剔除缺失值后计算偏度,避免干扰 col_skew = skew(df_filled[col].dropna()) # 绝对值>1判定为偏态(阈值可根据业务调整) if abs(col_skew) > 1: df_filled[col] = df_filled[col].fillna(df_filled[col].median()) else: df_filled[col] = df_filled[col].fillna(df_filled[col].mean()) # 处理分类列:取第一个众数填充(兼容多众数场景) for col in categorical_cols: mode_val = df_filled[col].mode()[0] df_filled[col] = df_filled[col].fillna(mode_val) return df_filled
关键细节说明
- 数据隔离:通过
copy()复制原数据,避免操作污染原始数据集 - 列类型识别:用
select_dtypes精准筛选数值/分类列,覆盖category类型的分类变量 - 偏度计算:先剔除缺失值再计算偏度,确保结果准确;默认用绝对值>1作为偏态判定标准,可根据业务需求调整阈值
- 众数处理:
mode()返回Series,取第一个元素避免多众数导致的赋值错误
测试示例
# 构造样本测试数据 sample_data = pd.DataFrame({ 'normal_num': [1,2,3,4,5,np.nan], # 近似正态分布(偏度接近0) 'skewed_num': [1,2,3,4,100,np.nan], # 右偏态分布 'category_col': ['A','B','A','C',np.nan,'B'] }) # 调用函数填充缺失值 filled_data = fill_missing_values(sample_data) print(filled_data)
错误排查方向
- 若
skew函数报错:检查目标列是否存在大量缺失值,或是否为非数值类型 - 若分类列填充失效:确认列类型是否为
object/category,避免将字符串格式的数值列误判为分类列 - 若仍有缺失值:检查是否存在未覆盖的数据类型(如
datetime),需单独补充处理逻辑
内容的提问来源于stack exchange,提问作者Karthik_hari1
相关产品推荐
相关产品推荐

