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

时间:2018-01-30 12:22:26

标签: python numbers negative-number

确定。我放弃了。

我有一个带有大数列(“Amount”)的DataFrame:

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 thingy(处理列中的所有元素),我需要在函数中使用它:

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有一个简单的函数/方法可以将我的数字(包括负数)转换为我可以计算的数字吗?

5 个答案:

答案 0 :(得分:1)

看起来你的字符串中的减号(' - ')符号有问题。

<强>尝试:

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

答案 1 :(得分: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

答案 2 :(得分:1)

如果您尝试对其进行编码该怎么办?

def make_float(num):
    num = num.encode('latin-1').replace(' ','').replace(',','.')
    return float(num)

答案 3 :(得分: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')

答案 4 :(得分:0)

确定。这似乎可以解决问题。 它分为3个步骤。

  1. 我用chardetect data.csv检查了我的数据集 它说&#39; utf8&#39;有信心0.99

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

  3. 我做了一个功能,

    def make_float(num): num = num.replace(你&#39; \ N {MINUS SIGN}&#39;,&#39; - &#39;)#编码减号 num = num.replace(&#39;,&#39;,&#39;。&#39;)#将小数点分隔符从逗号变为点 num = num.replace(unichr(160),&#39;&#39;)#将(非破坏)空格编码为&#39;&#39; num = float(num) return num

  4. 然后我使用pandas.read_csv(data...., encoding='utf8', converters={'Amount':make_float})

    将此函数传递给pandas.read_csv

    到目前为止工作良好。