【问题标题】:How do I fix invalid literal for int() with base 10 error in pandas如何修复 int() 的无效文字和 pandas 中的 base 10 错误
【发布时间】:2017-10-07 02:27:22
【问题描述】:

这是每当我尝试将数据帧转换为 int 时出现的错误。

("invalid literal for int() with base 10: '260,327,021'", 'occured at index Population1'

df 中的所有内容都是一个数字。我认为错误是由于末尾的额外引号引起的,但我该如何解决?

【问题讨论】:

    标签: python-2.7 pandas int jupyter-notebook valueerror


    【解决方案1】:

    对我来说,情况有点不同。

    我这样加载了我的数据框:

    my_converter = {'filename': str, 'revision_id': int}
    
    df = pd.read_csv("my.csv", header=0, sep="\t", converters=my_converter)
    

    因为head -n 3 my.csv 看起来像这样:

    "filename"     "revision_id"
    "some_filename.pdf"     "224"
    "another_filename.pdf"     "128"
    

    然而,在几千行之后,有一个这样的条目:

     "very_\"special\"_filename.pdf"     "46"
    

    这意味着我必须为read_csv() 指定转义字符。否则,它会尝试将special 转换为int 用于revision_id 字段并生成错误。

    所以正确的做法是:

    df = pd.read_csv("my.csv", header=0, sep="\t",  escapechar='\\', converters=my_converter)
    

    【讨论】:

      【解决方案2】:

      我使用pandas.to_numeric解决了这个错误

      在你的情况下,

      data.Population1 = pd.to_numeric(data.Population1, errors="coerce")
      

      'data' 是父对象。

      之后,您也可以将 float 转换为 int

      data.Population1.astype(int)
      

      【讨论】:

      • 这解决了我在值中有空格的问题。谢谢你。我还必须添加 df['series'].fillna(0).astype(int) aka .fillna(0) 以摆脱针对我的特定问题的 NaN。
      【解决方案3】:

      当字符串为浮点数时,其他人可能会遇到以下问题:

          >>> int("34.54545")
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      ValueError: invalid literal for int() with base 10: '34.54545'
      

      解决方法是先转换为浮点数,然后再转换为整数:

      >>> int(float("34.54545"))
      34
      

      或特定于熊猫:

      df.astype(float).astype(int)
      

      【讨论】:

        【解决方案4】:

        我运行这个

        int('260,327,021')
        

        得到这个

        ---------------------------------------------------------------------------
        ValueError                                Traceback (most recent call last)
        <ipython-input-448-a3ba7c4bd4fe> in <module>()
        ----> 1 int('260,327,021')
        
        ValueError: invalid literal for int() with base 10: '260,327,021'
        

        我向您保证,并非数据框中的所有内容都是数字。它可能看起来像一个数字,但它是一个带有逗号的字符串。

        您需要替换逗号,然后转到int

        pd.Series(['260,327,021']).str.replace(',', '').astype(int)
        
        0    260327021
        dtype: int64
        

        【讨论】:

        • 哇哦。太感谢了!所以这意味着我必须更换所有东西。 df 中的每个数字看起来都像我给的那个。
        • @Caribgirl 是的!除非从文件中读取,否则可以将参数传递给read_csv函数,即thousands=','
        • 非常感谢它的工作!我的天啊。我已经尝试解决这个问题好几个小时了!谢谢!!!!!!
        猜你喜欢
        • 2020-05-21
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2019-04-03
        相关资源
        最近更新 更多