将pandas DataFrame中带逗号的数字字符串转换为float


88

我有一个DataFrame,其中包含数字作为字符串,并带有千位标记的逗号。我需要将它们转换为浮点数。

a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)

我猜我需要使用locale.atof。确实

df[0].apply(locale.atof)

可以正常工作。我得到一系列的花车。

但是,当我将其应用于DataFrame时,会出现错误。

df.apply(locale.atof)

TypeError :(“无法将系列转换为”,发生在索引0')

df[0:1].apply(locale.atof)

给出另一个错误:

ValueError:('float()的无效文字:1,200',u'发生在索引0')

那么,如何将DataFrame字符串转换为浮点数的DataFrame?


2
这是个老问题了,但是OP遇到了这个错误,因为apply在DataFrame上将整个作为一系列传递给函数(在这种情况下locale.atof,期望有一个字符串)。如果您applymap在以下答案中使用@AndyHayden所做的方法,则应该可以做到这一点。
TC Proctor

Answers:


144

如果您要从csv中读取内容,则可以使用数千个arg

df.read_csv('foo.tsv', sep='\t', thousands=',')

与作为单独步骤执行操作相比,此方法可能更有效。


您需要先设置语言环境

In [ 9]: import locale

In [10]: from locale import atof

In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'

In [12]: df.applymap(atof)
Out[12]:
      0        1
0  1200  4200.00
1  7000    -0.03
2     5     0.00

我应该说我确实设置了语言环境。我仍然收到错误。
菲恩2014年

2
但是我使用的是df.read_fwf,它也具有“数千=”,“”选项,可以正常工作。谢谢。
菲恩2014年

再说一遍,为什么df.applymap(atof)对您有效,但对我却无效?我的语言环境是“ en_US.UTF-8”。
菲恩2014年

10
我对read_csv函数的“千”自变量技巧投了赞成票。那对我来说很棒。
rockfakie

3
我想补充一点,如果要处理浮点数,也可以使用“ decimal =',”“。
VessoVit '17

32

您可以使用pandas.Series.str.replace方法:

df.iloc[:,:].str.replace(',', '').astype(float)

此方法可以删除或替换字符串中的逗号。


1
我收到“ AttributeError:'DataFrame'对象没有属性'str'”,不知道为什么...
krassowski

1
但这有效:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski19

21

您可以一次转换一列,如下所示:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.