【问题标题】:Python - Converting dollar values to floatPython - 将美元值转换为浮点数
【发布时间】:2020-03-21 10:33:08
【问题描述】:

我有存储为字符串的销售数据。我正在尝试转换为浮点数以便我可以聚合数据,但我收到以下错误“ValueError:无法将字符串转换为浮点数:'revenue'。

我也尝试替换美元符号和逗号,但类型仍然是字符串。

>>> df['revenue'] = df['revenue'].replace('$| ','')
>>> type('revenue')
<class 'str'>

我也尝试了以下

pd.to_numeric(df.revenue)

但这也给了我一个错误,上面写着“ValueError: Unable to parse string "$1,557.97"

数据也有括号围绕负数(即(45.22)),我不确定如何转换。

【问题讨论】:

  • .to_dtype(float) ?
  • type('revenue') 检查字符串 'revenue' 而不是列 df['revenue'] - 检查 df.dtypes
  • 但如果我在 df['revenue'] 中替换 $ ,它不应该转换列中的数据吗?
  • 只有在读取文件时才会自动转换。在其他时候,您必须手动完成。
  • 如何手动操作?

标签: python string pandas floating-point


【解决方案1】:

感谢弗拉斯。我使用您的代码作为指导按以下方式进行了操作。

df['revenue'] = df['revenue'].replace('\$|,','', regex=True).replace('\(','-', regex=True).replace('\)','', regex=True)
pd.to_numeric(df['revenue'])

【讨论】:

    【解决方案2】:

    您必须使用regex=True\$,因为$regex 中具有特殊含义。
    您还必须删除,

    import pandas as pd
    
    df = pd.DataFrame({'revenue': ["$1,557.97 "]})
    
    df['revenue'] = df['revenue'].replace('\$|,', '', regex=True)
    
    df['revenue'] = pd.to_numeric(df['revenue'])
    
    print(df)
    print(df.dtypes)
    

    您不必删除开头或结尾的空格 - 但空格不能位于数字之间。


    你也可以用pd.to_numeric()代替

    df['revenue'] = df['revenue'].astype(float)
    

    但在转换为 float 之前,您仍然需要删除 $,


    编辑:要删除(( )),您可以使用regex

    .replace('\$|,|\(|\)', '', regex=True)
    

    因为()regex中有特殊含义所以必须使用\(,\)

    您也可以使用regex [...],这将不需要\

    .replace('[$,()]', '', regex=True)
    

    import pandas as pd
    
    df = pd.DataFrame({'revenue': [" $1,557.97 ", "((45.22))"]})
    
    #df['revenue'] = df['revenue'].replace('\$|,|\(|\)', '', regex=True)
    df['revenue'] = df['revenue'].replace('[$,()]', '', regex=True)
    
    #df['revenue'] = pd.to_numeric(df['revenue'])
    df['revenue'] = df['revenue'].astype(float)
    
    print(df)
    print(df.dtypes)
    

    【讨论】:

    • 感谢工作。如果正则表达式为真,是否需要“$”前面的“\”?是否可以使用 regex=False 来做到这一点?
    • 是的,你会做类似.replace('$','').replace(',','') 的事情。如果没有regex=True,则无法在一次通话中完成。
    • 如果您使用| 替换不同的字符,那么您需要regex=True,因为| 仅适用于regex。如果您使用regex,那么$ 表示"beginning of line",而不是美元。要在 regex 中使用美元,您需要 \$ 。如果没有regex,您必须单独替换每个字符 - 就像在@nneonneo 评论中一样。
    • 谢谢。我做了很长的路,但它有效。将提供我的答案。
    猜你喜欢
    • 2014-02-08
    • 2022-01-24
    • 2021-12-25
    • 2021-03-31
    • 1970-01-01
    • 2016-04-14
    • 2021-07-16
    • 2016-01-12
    相关资源
    最近更新 更多