Pandas报TypeError: bad operand type for unary ~: 'float' 问题咨询
代码实际功能确认
你对代码功能的理解是正确的,这段代码的设计目标是:
- 对
Feature2列做类型转换:仅把纯数字格式的字符串转换为pandas可空整数类型Int64 - 非数字格式的字符串、空值(np.NaN)保持原有值不变
- 实现逻辑用到了
DataFrame.where方法:满足条件时保留原值,不满足条件时替换为转换后的数值结果
报错原因
报错的直接诱因是Feature2列中的np.NaN值:df.Feature2.str.isnumeric()是字符串专属方法,遇到非字符串类型的np.NaN时不会返回布尔值,而是返回同样为float类型的NaN,取反运算符~无法对float类型执行操作,因此抛出TypeError。
修复方案
只需给str.isnumeric()方法补充na参数,指定空值的返回结果为布尔值即可,我们指定空值返回False,符合「空值保留原值不转换」的需求:
修改核心逻辑行:
把原来的~df.Feature2.str.isnumeric()
替换为~df.Feature2.str.isnumeric(na=False)
修复后完整可运行代码
import pandas as pd import numpy as np dummy_data1 = { 'id': ['1', '2', '3', '4', '5'], 'Feature1': ['A', 'C', 'E', 'G', 'I'], 'Feature2': ['Mouse', 'dog', 'house and parrot', '23', np.NaN], 'dates': ['12/12/2020','12/12/2020','12/12/2020','12/12/2020','12/12/2020']} df1 = pd.DataFrame(dummy_data1, columns = ['id', 'Feature1', 'Feature2', 'dates']) df1 = df1.assign( Feature2=lambda df: df.Feature2.where( ~df.Feature2.str.isnumeric(na=False), pd.to_numeric(df.Feature2, errors="coerce").astype("Int64"), ) ) print(df1)
运行输出结果
id Feature1 Feature2 dates 0 1 A Mouse 12/12/2020 1 2 C dog 12/12/2020 2 3 E house and parrot 12/12/2020 3 4 G 23 12/12/2020 4 5 I <NA> 12/12/2020
可以看到第3行的字符串"23"已经成功转换为Int64类型的23,空值保留为pandas可空类型的
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

