Pandas中使用df.fillna()填充DataFrame空值后数据类型全部变为object的高效解决方法咨询
问题根源&快速解决办法
嘿,这个问题我之前也碰到过!核心原因是你在填充数值型列的时候犯了一个小语法错误:你写的是df['umur'].fillna(df['umur'].mean, inplace=True),这里的mean是方法对象本身,而不是调用方法计算出来的均值数值。当你用函数对象去填充原本是float64类型的列时,Pandas会把整个列的 dtype 强制转为object,因为列里同时存在数值和函数两种不同类型的数据了。
第一步:修正数值列的填充代码
只需要把mean改成mean()(调用方法获取实际的均值)就行:
# 数值型特征填充(修正后) df['umur'].fillna(df['umur'].mean(), inplace=True) df['gaji'].fillna(df['gaji'].mean(), inplace=True) df['berat'].fillna(df['berat'].mean(), inplace=True) df['tinggi'].fillna(df['tinggi'].mean(), inplace=True) df['stress'].fillna(df['stress'].mean(), inplace=True)
这样改完后,数值型列会保持原来的float64类型,不会变成object。
更高效的批量处理方式
如果不想逐个列写填充代码,可以用select_dtypes批量筛选不同类型的列,统一处理,既简洁又不容易出错:
# 批量填充分类型特征:用众数填充 categorical_cols = df.select_dtypes(include=['object']).columns df[categorical_cols] = df[categorical_cols].fillna(df[categorical_cols].mode().iloc[0]) # 批量填充数值型特征:用均值填充 numeric_cols = df.select_dtypes(include=['float64']).columns df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].mean())
这种方法会自动识别列的类型,用对应逻辑填充,同时严格保留原有列的数据类型,不用手动一个个指定列名。
验证结果
处理完后,你可以运行df.dtypes查看各列类型,应该会回到你初始的状态:数值列是float64,分类型列是object。
内容的提问来源于stack exchange,提问作者Mohamad Abyannaufal
相关产品推荐
相关产品推荐

