Pandas无法识别数值型缺失值,HDI for year列空值填充失败排查
代码问题分析
- 问题1:
is_numeric_dtype入参使用错误is_numeric_dtype仅支持判断单个数组/Series的类型,传入整个DataFrame会直接返回False,因此你写的数值型缺失值判断的外层if条件永远不会触发,自然没有执行结果。 - 问题2:缺失值判断逻辑错误
df.isnull().any()返回的是每列是否存在缺失值的布尔Series,不是单个布尔值,和is True做比对永远返回False,就算进入外层if也不会执行填充逻辑。 - 问题3:语法与逻辑错误
np.mean(df.column)写法错误,pandas没有df.column这种取所有列均值的用法,运行会直接抛出属性不存在的报错。 - 额外问题:名义型填充逻辑bug
你当前名义型缺失值填充的代码里,把df[i].value_counts().index[0]写成了字符串,实际运行会把'?'替换成这串文本,而不是列的真实众数。
修正后可运行代码
数值型缺失值均值填充
# 遍历所有列,对数值型列做缺失值均值填充 for col in df.columns: if is_numeric_dtype(df[col]): if df[col].isnull().any(): col_mean = df[col].mean() print(f"mean-{col} = {col_mean}") df[col] = df[col].fillna(col_mean)
名义型缺失值众数填充
# 对字符型列做缺失值(含?)众数填充 for col in df.columns: if df[col].dtype == object: print(col, df[col].unique()) # 计算众数 col_mode = df[col].value_counts().index[0] print(f"mode-{col} = {col_mode}") # 替换?和空值为众数 df[col] = df[col].replace('?', col_mode) df[col] = df[col].fillna(col_mode)
运行后你可以用df.isnull().any()验证填充结果,HDI for year列的缺失值会被计算出的均值0.7766左右填充。
内容的提问来源于stack exchange,提问作者melololo
相关产品推荐
相关产品推荐

