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

151 投票
4 回答
198811 浏览
提问于 2025-04-17 20:33

我有一个数据表,里面的数字是以字符串形式存储的,并且用逗号来表示千位分隔符。我需要把它们转换成浮点数。

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

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

df[0].apply(locale.atof)

这样做的效果是我得到了一个浮点数的序列。

但是当我把这个方法应用到整个数据表时,我遇到了一个错误。

df.apply(locale.atof)

类型错误:("无法将序列转换为", u'发生在索引 0')

还有

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

出现了另一个错误:

值错误:('无效的浮点数格式:1,200', u'发生在索引 0')

那么,我该如何将这个包含字符串的数据表转换成浮点数的数据表呢?

4 个回答

43

你可以使用 pandas.Series.str.replace 这个方法:

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

这个方法可以用来去掉字符串中的逗号,或者把逗号替换成其他东西。

65

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

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

如果你是从 CSV文件中读取数据,那么你可以使用 thousands参数

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

撰写回答