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
相关产品推荐
相关产品推荐

