有点困惑,因为我很肯定我以前曾经做过这项工作。
我创建了以下方法…
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文档中的一个属性:
isnumeric
str
https://pandas.pydata.org/pandas- docs/stable/generation/pandas.Series.str.isnumeric.html?highlight=isnumeric#pandas.Series.str.isnumeric
除非我没有正确解释信息?
str.isnumeric()仅在Python 3上可用。该错误表明您使用的是Python 2,而只有Python 2unicode.isnumeric()存在。
str.isnumeric()
unicode.isnumeric()
您应该真正使用str.isdecimal()或更好地使用 异常处理 :
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()匹配float()不接受的BMP中的430个Unicode代码点,并且有些代码点.isdigit()返回true也不能转换。
.isnumeric()
float()
.isdigit()
您可以生成自己的表进行检查:
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列的所有不可转换代码点都有叉号。
decimal
如果要isdecimal()在Python 2中使用,则必须先将字节字符串解码为Unicode。
isdecimal()