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

Pandas缺失值填充UDF仅作用于合并后数据集前半部分的原因排查

问题描述

合并claims_data与cust_data得到cust_claims数据集后,需要按规则填充缺失值:连续型字段用均值,分类型字段用众数。编写了以下缺失值填充自定义函数(UDF),但该函数仅对原claims_data对应的列生效,原cust_data的列仍存在缺失值,求现象原因。

UDF代码

def missing_imputation(x, stats = 'mean'):
    if (x.dtypes == 'float64') | (x.dtypes == 'int64'):
        x = x.fillna(x.mean()) if stats == 'mean' else x.fillna(x.mode())
    return x

调用代码

cust_claims = cust_claims.apply(lambda x: missing_imputation(x))
原因分析
  • 仅处理指定数值类型列,完全忽略分类型列:你的UDF只针对float64和int64类型的列做填充,对分类型字段(比如object、category类型)没有任何缺失值处理逻辑。如果原cust_data的列以分类型为主,这些列的缺失值自然会保留。
  • 默认参数导致分类型分支未触发:调用函数时用的是默认参数stats='mean',就算后续想处理分类型列,也不会进入else分支;而且x.mode()返回的是Series(可能有多个众数),直接传入fillna会无法正确填充。
  • 数值类型判断范围过窄:如果原cust_data的数值型列是int32、float32这类其他数值类型,会被你的条件判断排除,导致这些列的缺失值也得不到处理。
修正后的代码
import pandas as pd

def missing_imputation(x):
    # 处理所有数值类型的列,用均值填充
    if pd.api.types.is_numeric_dtype(x):
        x = x.fillna(x.mean())
    # 处理字符串、分类类型的列,取第一个众数填充
    elif pd.api.types.is_string_dtype(x) or pd.api.types.is_categorical_dtype(x):
        x = x.fillna(x.mode()[0])
    return x

# 调用函数处理全量列
cust_claims = cust_claims.apply(missing_imputation)

内容的提问来源于stack exchange,提问作者Nitish Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:32:50