在python中尝试将对象转换为浮点时出错

2024-04-25 13:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件把存款余额列为字符串。为了绘制这些数字,我试图将这些对象转换成一个浮点数。因此,我编写了代码来删除$,并在值前后去掉空格。你知道吗

member_clean.TotalDepositBalances = member_clean.TotalDepositBalances.str.replace('$', '')

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].str.strip()

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].astype(float)

当我运行代码时,会收到一条错误消息

ValueError:无法将字符串转换为浮点值:

就这样。在我添加str.strip公司,错误消息显示一些值前后有空格,因此我知道要删除这些值。但我有点困惑是什么原因造成的

删除空格和$后,我查看了列的值,所有内容看起来都正常。这是一个样本。你知道吗

  1. 309.00
  2. 38.00
  3. 12486.00英镑
  4. 6108.00
  5. 2537.00

有什么想法,我可以检查在列中,可能会导致这个错误


Tags: 文件字符串代码clean消息错误绘制数字
2条回答

必须删除逗号,因为它们不是Python可以识别的数字格式。因此,考虑到您给出的列表作为可能的输入:

str_num = ['309.00 ', ' 38.00 ', ' 12,486.00 ', '6,108.00', ' 2,537.00']

你必须这样做:

list(map(lambda s: float (s.replace (',', '')), str_num))

并给出你的浮动列表:

[309.0, 38.0, 12486.0, 6108.0, 2537.0]

注意:您不需要执行str.strip(),因为这些空格会自动从float casting操作中删除。你知道吗

遵循管道,在转换为float之前,需要执行以下操作:

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].str.replace(',', '')

或者可以在一行代码上运行整个管道,如下所示:

member_clean['TotalDepositBalances'] = member_clean['TotalDepositBalances'].replace('$', '').replace(',', '').astype(float)

额外:性能

Here您将发现一些测试,这些测试提供了执行字符串中插入的多个替换的各种方法的比较。令人惊讶的是,在cascade中使用replace(就像在管道中一样),对于这种类型的操作,它比regex更有效。读一读。你知道吗

处理大型数据集或系列的一种有用方法是创建一个包含已更正值的查找字典,以便不会重新计算重复值:

import pandas as pd
import re

def fast_num_conversion(s):
    """
    This is an extremely fast approach to parsing messy numbers to floats.
    For large data, the same values are often repeated. Rather than
    re-parse these, we store all unique dates, parse them, and
    use a lookup to convert all figures. 
    (Should be 10X faster than without lookup dict)

       Note, input must be a pandas series.
    """
    f_convert = lambda x: re.sub('[$\-,\| ]', '', x)
    f_float = lambda x: float(x) if x!='' else np.NaN
    vals = {curr:f_float(f_convert(curr)) for curr in s.unique()}
    return s.map(vals)

str_num = ['309.00', '38 .00 ', '12, 486.00', '6,108.00', '2,537.00']

print(pd.Series(fast_num_conversion))
0      309.0
1       38.0
2    12486.0
3     6108.0
4     2537.0

相关问题 更多 >

    热门问题