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

phe*_*eon 59 python pandas

我有一个DataFrame包含数字作为字符串与数千标记的逗号.我需要将它们转换为浮点数.

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

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

df[0].apply(locale.atof)
Run Code Online (Sandbox Code Playgroud)

按预期工作.我得到了一系列花车.

但是当我将它应用于DataFrame时,我收到一个错误.

df.apply(locale.atof)
Run Code Online (Sandbox Code Playgroud)

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

df[0:1].apply(locale.atof)
Run Code Online (Sandbox Code Playgroud)

给出另一个错误:

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

那么,我如何将这个DataFrame字符串转换为浮动的DataFrame?

And*_*den 102

如果您从csv读入,那么您可以使用数千个arg:

df.read_csv('foo.tsv', sep='\t', thousands=',')
Run Code Online (Sandbox Code Playgroud)

该方法可能比作为单独步骤执行操作更有效.


您需要先设置区域设置:

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
Run Code Online (Sandbox Code Playgroud)

  • 我为read_csv函数的'数千'参数提示投票了.这对我很有用. (8认同)
  • 我想补充说,如果你正在处理浮点数,你也可以使用"decimal =','". (3认同)
  • 但是我使用的是df.read_fwf,它也有"千位=','"选项,这有效.谢谢. (2认同)

小智 31

您可以像这样一次转换一列:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个*可怕的*想法。它将把 `0,2` 转换为 `2` 而不是 `0.2`。根本没有办法使用替换来解析本地化的数字文字。那“10,000.0”呢?那“10.000,00”呢? (7认同)
  • 谢谢你,@PanagiotisKanavos。你的评论阻止了我陷入这个重大陷阱并继续处理严重混乱的数据。`pd.Series('0,5').str.replace(',', '').astype(float)` 返回 5! (2认同)

she*_* ke 20

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

df.iloc[:,:].str.replace(',', '').astype(float)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我的电话号码有多个逗号怎么办?例如:“1,099,99”,如何将其转换为“'1099.99'”? (3认同)
  • 我收到“AttributeError:'DataFrame'对象没有属性'str'”,不知道为什么...... (2认同)
  • 但这是有效的: `df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)` (2认同)