将带逗号的数字字符串在pandas DataFrame中转换为浮点数
我有一个数据表,里面的数字是以字符串形式存储的,并且用逗号来表示千位分隔符。我需要把它们转换成浮点数。
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