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

Convert number strings with commas in pandas DataFrame to float

提问人:pheon 提问时间:3/3/2014 最后编辑:Prashant Pimpalepheon 更新时间:1/11/2023 访问量:189144

问:

我有一个 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:(“无法将序列转换为”,u'发生在索引 0')

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

给出另一个错误:

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

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

蟒蛇 熊猫

评论

2赞 T.C. Proctor 3/2/2018
老问题,但是 OP 得到了这个错误,因为在 DataFrame 上将整个作为一个系列传递给函数(在这种情况下,它需要一个字符串)。如果您使用@AndyHayden在下面答案中执行的方法,您应该能够很好地做到这一点。applylocale.atofapplymap

答:

231赞 Andy Hayden 3/3/2014 #1

如果你是从 csv 读入的,那么你可以使用 thousand 参数

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

评论

0赞 pheon 3/3/2014
我应该说我确实设置了语言环境。我仍然收到错误。
2赞 pheon 3/3/2014
但是我正在使用 df.read_fwf,并且它也有“数千=',”选项,它有效。谢谢。
0赞 pheon 3/3/2014
话又说回来,为什么df.applymap(atof)对你有用,而对我不起作用?我的区域设置是“en_US。UTF-8' 中。
15赞 rockfakie 4/29/2016
我投票支持read_csv函数的“数千”参数提示。这对我来说很有效。
7赞 VessoVit 3/23/2017
我想补充一点,如果你正在处理浮点数,你也可以使用“decimal=',' ”。
43赞 shen ke 4/18/2018 #2

您可以使用熊猫。Series.str.replace 方法:

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

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

评论

3赞 krassowski 11/22/2019
我收到“AttributeError: 'DataFrame' object has no attribute 'str'”,不知道为什么......
3赞 krassowski 11/22/2019
但这有效:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
3赞 Abimael Domínguez 7/10/2021
如果我的号码有多个逗号怎么办?比如:“1,099,99”,我怎么能把它转换成“'1099.99'”?
65赞 ghollah kioko 7/19/2019 #3

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

df['colname'] = df['colname'].str.replace(',', '').astype(float)

评论

0赞 Cristian Avendaño 2/17/2021
有了这个,我收到一个警告:FutureWarning:正则表达式的默认值将在将来的版本中从 True 更改为 False。此外,当 regex=True 时,单字符正则表达式不会被视为文本字符串。不知道为什么它假设 regex=True
6赞 Panagiotis Kanavos 6/18/2021
这是一个可怕的想法。它将转换为 而不是 .根本没有办法使用替换来解析本地化的数字文字。怎么样?怎么样?0,220.210,000.010.000,00
2赞 jlplenio 7/9/2021
谢谢你,@PanagiotisKanavos。您的评论阻止了我陷入这个重大陷阱并继续处理严重混乱的数据。 返回 5!pd.Series('0,5').str.replace(',', '').astype(float)
1赞 Robert Van Ysendyck 1/11/2023 #4

这将适用于“-55,00”或“5.500,00”等字符串,并将它们分别转换为浮点数 -55.00 和 5500.00。

df['colname'] = df['colname'].str.replace('.','', regex=True).str.replace(',', '.', regex=True).astype(float)