提问人:pheon 提问时间:3/3/2014 最后编辑:Prashant Pimpalepheon 更新时间:1/11/2023 访问量:189144
将 pandas DataFrame 中带逗号的数字字符串转换为浮点数
Convert number strings with commas in pandas DataFrame to float
问:
我有一个 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
答:
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,2
2
0.2
10,000.0
10.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)
下一个:土耳其字符的未知字符
评论
apply
locale.atof
applymap