确定。我放弃了。
我有一个带有大数列(“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有一个简单的函数/方法可以将我的数字(包括负数)转换为我可以计算的数字吗?
答案 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个步骤。
我用chardetect data.csv
检查了我的数据集
它说&#39; utf8&#39;有信心0.99
我确保将其传递给我的pandas.read_csv:pandas.read_csv(data....., encoding = 'utf8')
我做了一个功能,
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
然后我使用pandas.read_csv(data...., encoding='utf8', converters={'Amount':make_float})
到目前为止工作良好。