Python pandas中含NaN的Object类型列如何转换为Int类型
问题原因
报错ValueError: could not convert string to float: 的核心原因是参与运算的D104、D106等哑变量列中存在空字符串、首尾带不可见空格的脏数据,并非纯数值内容,直接调用类型转换方法会触发报错。
列类型为object时,+运算符默认执行字符串拼接,因此直接用eval计算会得到0000、0100这类拼接结果,而非数值求和。
另外你之前写的data_final['D104'].fillna()属于语法错误,fillna()必须传入指定的填充值,否则不会生效。
解决步骤
- 批量清洗+转换所有哑变量列的类型
先统一处理列内的脏数据,再转为数值类型:
import pandas as pd # 指定需要参与求和的哑变量列 calc_cols = ['D104', 'D106', 'D107', 'D108'] for col in calc_cols: # 去除每个值首尾的空白字符,把空字符串统一替换为缺失值 data_final[col] = data_final[col].astype(str).str.strip().replace('', pd.NA) # 强制转换为数值,无法解析的内容设为缺失值,最终转为可空整数类型 data_final[col] = pd.to_numeric(data_final[col], errors='coerce').astype('Int64') # 哑变量的缺失值通常填充0,可根据自身业务逻辑调整填充值 data_final[calc_cols] = data_final[calc_cols].fillna(0)
- 执行按行求和
类型转换完成后,优先用sum做按行计算,比eval容错性更高:
data_final['violencia'] = data_final[calc_cols].sum(axis=1)
如果要继续用eval也可以,此时列均为数值类型,不会再出现字符串拼接问题:
data_final.eval('violencia = D104 + D106 + D107 + D108', inplace=True)
结果验证
转换完成后调用value_counts(),会输出0-4的数值计数结果,不会再出现字符串格式的拼接值:
data_final['violencia'].value_counts().sort_index()
内容的提问来源于stack exchange,提问作者Sandra Mireli Martnez Gutirrez
相关产品推荐
相关产品推荐

