【问题标题】:How to efficiently handle European decimal separators using the pandas read_csv function?如何使用 pandas read_csv 函数有效处理欧洲小数点分隔符?
【发布时间】:2012-07-30 13:59:08
【问题描述】:

我正在使用read_csv 将 CSV 文件读入 Pandas 数据帧。我的 CSV 文件包含大量小数/浮点数。这些数字使用欧洲十进制表示法编码:

1.234.456,78

这意味着'.'用作千位分隔符,',' 是小数点。

熊猫 0.8。提供了一个名为“千”的read_csv 参数来设置千位分隔符。还有一个额外的论点来提供小数点吗?如果不是,解析欧式十进制数最有效的方法是什么?

目前我正在使用字符串替换,我认为这会显着降低性能。我使用的编码是这样的:

# Convert to float data type and change decimal point from ',' to '.'
f = lambda x: string.replace(x, u',', u'.')
df['MyColumn'] = df['MyColumn'].map(f)

感谢任何帮助。

【问题讨论】:

标签: python csv decimal pandas


【解决方案1】:

对于欧式编号,请使用pandas.read_csv 中的thousandsdecimal 参数。

例如:

pandas.read_csv('data.csv', thousands='.', decimal=',')

来自docs

数千

str,可选的千位分隔符。

十进制

str, 默认‘.’ 识别为小数点的字符 (例如,对欧洲数据使用​​“,”)。

【讨论】:

  • 这是目前正确的答案,在 Pandas 将这两个参数引入 read_csvto_csv 之后。
【解决方案2】:

您可以在read_csv 中使用converters kw。像这样给/tmp/data.csv

"x","y"                                                                         
"one","1.234,56"                                                                
"two","2.000,00"   

你可以这样做:

In [20]: pandas.read_csv('/tmp/data.csv', converters={'y': lambda x: float(x.replace('.','').replace(',','.'))})
Out[20]: 
     x        y
0  one  1234.56
1  two  2000.00

【讨论】:

  • 谢谢,它有效。我不确定转换器功能是否比 string.replace 快。探查器会告诉你。 ;-)
  • 可能速度是一样的,但是使用converters,您可以获得指定列类型的能力。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2020-10-15
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多