使用 pandas.read_csv 读取带有空格的 CSV 文件作为千位分隔符

Posted

技术标签:

【中文标题】使用 pandas.read_csv 读取带有空格的 CSV 文件作为千位分隔符【英文标题】:Read CSV file with space as thousand-seperator using pandas.read_csv 【发布时间】:2018-03-09 22:06:04 【问题描述】:

我有一个(法语)数据集,如下所示:

time;col1;col2;col3
06.09.2017 05:30;329,02;5,7;259
06.09.2017 05:40;500,5;6,6;261
06.09.2017 05:50;521,73;6,7;266
06.09.2017 06:00;1 091,33;9,1;273
06.09.2017 06:10;1 262,43;10;285

我尝试使用以下命令读取它:

import pandas as pd
df=pd.read_csv("Example_dataset.csv",
            index_col=0,
            encoding='latin',
            parse_dates=True,
            dayfirst=True,
            sep=';',
            decimal=',',
            thousands=' ')

col2 和 col3 被识别为浮点数和整数,但 col1 不被识别为数字,因为那里有千位分隔符。有没有一种简单的方法来读取这个数据集?设置thousands=' ' 似乎不起作用:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 5 entries, 2017-09-06 05:30:00 to 2017-09-06 06:10:00
Data columns (total 3 columns):
col1    5 non-null object
col2    5 non-null float64
col3    5 non-null int64
dtypes: float64(1), int64(1), object(1)
memory usage: 160.0+ bytes

有什么建议吗?

【问题讨论】:

试试:df.col1 = df.col1.str.replace(' ', '').astype(float) 我刚刚在 pandas 0.20.1 上进行了测试,您的代码可以正常工作,您使用的是什么版本? 那行不通。我认为这个空间是一个“不间断的空间”我修改了你的代码如下:df.col1 = df.col1.str.replace('\s+', '').str.replace(',','.').astype(float) @zipa,我使用的是 0.20.2 @zipa 降级到 0.20.1 并不能解决我的问题。 【参考方案1】:

如果您有不间断的空格,我建议使用更积极的正则表达式str.replace

df.col1 = df.col1.str.replace('[^\d.,e+-]', '')\
               .str.replace(',', '.').astype(float)

正则表达式

[       # character group
^       # negation - ignore everything in this character group
\d      # digit
.       # dot
e       # 'e' - exponent
+-      # signs 
]      

【讨论】:

以上是关于使用 pandas.read_csv 读取带有空格的 CSV 文件作为千位分隔符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pandas.read_csv 在双引号之间读取带有千位分隔符的数字 [重复]

使用 pandas 读取带有 numpy 数组的 csv

使用 pandas 读取带有 numpy 数组的 csv

对于不规则的分隔符,如何使 pandas read_csv 中的分隔符更灵活 wrt 空格?

如何使用 pandas.read_csv() 将索引数据读取为字符串?

使用 pandas.read_csv 从 URL 读取压缩的 CSV 文件时出错