将字符串中的负数转换为浮点数(Python)?

4
好的。我放弃了。
我有一个数据框,其中有一列(“Amount”)是大数字:
Amount
-1 000 000,00
 4 848 903,00
-2 949 234,00
13 038 023,00
 7 985 232,00
 ....

我希望您能将这些转换为我可以进行计算的数字。
让我们进行调查:
>type(b["Amount"][0])
str

好的,这是一个字符串。

>float("-1 000 000,00".replace(' ', '').replace(',','.'))
-1000000.00

好的,非常棒!

为了创建一个 lambda 函数(用于处理列中的所有元素),我需要将其放在一个函数中:

def make_float(num):
    num = num.replace(' ','').replace(',','.')
    return float(num)


>make_float(b["Amount"][0])
ValueError: could not convert string to float: −1 000 000.00

什么?!
>b["Amount"][0].replace(' ','').replace(',','.')
Out[258]:
'\xe2\x88\x921\xc2\xa0000\xc2\xa0000.00'

哦不!!Unicode地狱!我放弃了。

Python是否有一个易于使用的函数/方法,可以将我的数字(包括负数)转换为可计算的内容?


我甚至尝试了一个函数,它是这样的:def make_float(num):num = num.replace(',','.') num = num.replace(' ','') num = num.replace('\U00002013', '-') num = num.replace(u'\N{MINUS SIGN}', '-') num = num.decode('unicode_escape').encode('ascii','ignore') num = float(num) return num - Cronos
print(b["Amount"][0]) 会打印出什么?在 make_float 函数中,你能否在设置 num 变量后添加 print(num) 并查看它打印出了什么? - kiyah
你写的函数运行良好。问题应该是 b["Amount"][0] - Vikas Periyadath
我正在使用pandas.read_csv读取这个文件。更改编码可能有帮助,也可能没有帮助? - Cronos
print(b["Amount"][0]) 的值为 -1 000 000,00 - Cronos
b["Amount"][0] 的值为 '\xe2\x88\x921\xc2\xa0000\xc2\xa0000,00' - Cronos
5个回答

2

看起来您在字符串中遇到了减号('-')的问题。

尝试:

def make_float(num):
    num = num.replace(' ','').replace(',','.').replace("−", "-")
    return float(num)

1
这应该解决了你的问题。问题在于获取列的第一个值作为值时,应该使用 pd.Series.values[0]
import pandas as pd

s = pd.Series(['-1 000 000,00'])

def make_float(num):
    num = num.replace(' ','').replace(',','.')
    return float(num)

s.map(make_float)

# 0   -1000000.0
# dtype: float64

make_float(s.values[0])
# -1000000.0

1
如果您尝试进行编码,会发生什么?
def make_float(num):
    num = num.encode('latin-1').replace(' ','').replace(',','.')
    return float(num)

1
你的数据包含Unicode减号(Unicode中的多个减号之一)和不间断空格(Unicode中的多个空格字符之一)。
你可以使用str.translate()将字符转换为可以被float()正确解析的格式。
def make_float(num):
     return float(num.translate({0x2c: '.', 0xa0: None, 0x2212: '-'}))

make_float('−1\xa0000\xa0000,00')

0

好的。这似乎解决了问题。 这是一个三步解决方案。

  1. 我使用 chardetect data.csv 检查了我的数据集, 它显示 'utf8',置信度为 0.99

  2. 我确保将其传递给我的 pandas.read_csv: pandas.read_csv(data....., encoding = 'utf8')

  3. 我创建了一个函数,

def make_float(num):
    num = num.replace(u'\N{MINUS SIGN}', '-')  # encode the minus sign
    num = num.replace(',','.') #change the decimal separator from comma to dot
    num = num.replace(unichr(160), '') # encode the (non-breaking) space to ''
    num = float(num)
    return num

I then passed this function to the pandas.read_csv thing with `pandas.read_csv(data...., encoding='utf8', converters={'Amount':make_float}) `

Working good so far.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接