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

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

关键细节说明

  1. 数据隔离:通过copy()复制原数据,避免操作污染原始数据集
  2. 列类型识别:用select_dtypes精准筛选数值/分类列,覆盖category类型的分类变量
  3. 偏度计算:先剔除缺失值再计算偏度,确保结果准确;默认用绝对值>1作为偏态判定标准,可根据业务需求调整阈值
  4. 众数处理: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:51:22