有点困惑,因为我肯定我以前有过这个工作。
我创建了以下方法...
def p2f(x):
if x.strip('%').isnumeric():
return float(x.strip('%'))/100
elif x in ['SUPP', 'NEW', 'LOWCOV', 'NA', '']:
return 0.0
else:
return x
但是当我在导入的CSV文件上运行它时,它会产生此错误:
AttributeError: 'str' object has no attribute 'isnumeric'
虽然我可以看到isnumeric
是文档中str
的属性:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.isnumeric.html?highlight=isnumeric#pandas.Series.str.isnumeric
除非我没有正确解释信息?
str.isnumeric()
仅在 Python 3 上可用。该错误表明您使用的是 Python 2,其中仅存在unicode.isnumeric()
。
你真的应该使用str.isdecimal()
,或者更好的是,使用异常处理:
def p2f(x):
try:
return float(x.strip('%'))/100
except ValueError:
return 0.0 if x in ('SUPP', 'NEW', 'LOWCOV', 'NA', '') else x
.isnumeric()
匹配 BMP 中 float()
不接受的 430 个 Unicode 代码点,并且有些代码点.isdigit()
返回 true,这些代码点也是不可转换的。
您可以生成自己的表来检查:
for i in range(2 ** 16):
c = chr(i)
if c.isnumeric() or c.isdigit() or c.isdecimal():
try:
f = float(c)
except ValueError:
f = '<not convertible>'
di, de, nu = ('u2705' if test() else 'u274c' for test in (c.isdigit, c.isdecimal, c.isnumeric))
print(f'{c!a:<6} {c}tdigit: {di} decimal: {de} numeric: {nu} float: {f}')
它产生如下输出:
'0' 0 digit: ✅ decimal: ✅ numeric: ✅ float: 0.0
'1' 1 digit: ✅ decimal: ✅ numeric: ✅ float: 1.0
'2' 2 digit: ✅ decimal: ✅ numeric: ✅ float: 2.0
'3' 3 digit: ✅ decimal: ✅ numeric: ✅ float: 3.0
'4' 4 digit: ✅ decimal: ✅ numeric: ✅ float: 4.0
'5' 5 digit: ✅ decimal: ✅ numeric: ✅ float: 5.0
'6' 6 digit: ✅ decimal: ✅ numeric: ✅ float: 6.0
'7' 7 digit: ✅ decimal: ✅ numeric: ✅ float: 7.0
'8' 8 digit: ✅ decimal: ✅ numeric: ✅ float: 8.0
'9' 9 digit: ✅ decimal: ✅ numeric: ✅ float: 9.0
'xb2' ² digit: ✅ decimal: ❌ numeric: ✅ float: <not convertible>
'xb3' ³ digit: ✅ decimal: ❌ numeric: ✅ float: <not convertible>
'xb9' ¹ digit: ✅ decimal: ❌ numeric: ✅ float: <not convertible>
'xbc' ¼ digit: ❌ decimal: ❌ numeric: ✅ float: <not convertible>
'xbd' ½ digit: ❌ decimal: ❌ numeric: ✅ float: <not convertible>
'xbe' ¾ digit: ❌ decimal: ❌ numeric: ✅ float: <not convertible>
您会发现只有decimal
列具有所有不可转换代码点的交叉。
如果你想在Python 2中使用isdecimal()
,你必须先将字节串解码为Unicode。