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

发布于 2021-01-29 15:01:48

有点困惑,因为我很肯定我以前曾经做过这项工作。

我创建了以下方法…

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'

尽管我可以看到这isnumericstr文档中的一个属性:

https://pandas.pydata.org/pandas-
docs/stable/generation/pandas.Series.str.isnumeric.html?highlight=isnumeric#pandas.Series.str.isnumeric

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

关注者
0
被浏览
143
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    str.isnumeric()仅在Python 3上可用。该错误表明您使用的是Python 2,而只有Python
    2unicode.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列的所有不可转换代码点都有叉号。

    如果要isdecimal()在Python 2中使用,则必须先将字节字符串解码为Unicode。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看