AttributeError:'str'对象没有属性'isnumeric'

时间:2018-03-13 18:39:30

标签: python pandas

稍微有点困惑,因为我很肯定我之前有过这个工作。

我创建了以下方法......

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

除非我没有正确地解释信息?

1 个答案:

答案 0 :(得分:0)

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()匹配float()不接受的BMP中的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。