导入具有随机列数的CSV

时间:2015-07-02 15:28:22

标签: python csv pandas

我有一个脚本,它以CSV格式读取一些测量数据,然后用它进行各种绘图和填充。

现在我有了一个新的数据集,其中一些白痴认为在行末添加一些随机注释很有帮助,如下所示:

01.02.1988 00:00:00   ;   204.94     
01.03.1988 00:00:00   ;   204.87 ; something
01.04.1988 00:00:00   ;   205.41     
01.05.1988 00:00:00   ;   205.64 ; something ; something else    
01.06.1988 00:00:00   ;   205.59 ; also something    
01.07.1988 00:00:00   ;   205.24

这给了我一个很好的

ValueError: Expected 2 fields in line 36, saw 3

等等。

根据thisthis,我必须在阅读时使用names=['whatever','else']参数。

但不知怎的,这种情况各种各样。所以这里有一些例子:

CSV文件

Stuff
more stuff I dont need
Date;level;crap1;crap2;crap3;crap4;crap5;crap6
01.01.1988 00:00:00   ;   204.87     
01.02.1988 00:00:00   ;   204.94     
01.03.1988 00:00:00   ;   204.87 

“漂亮”标题显然是“手工制作”,但我应该能够跳过它!?

CSV阅读器

ValReader = pd.read_csv(csv_list[counter],sep=r'\s*;',skiprows=DateStart,names=['Date','level','crap1','crap2','crap3','crap4','crap5','crap6'],usecols=['Date','level'],index_col='Date',dayfirst=True,parse_dates=True)

我得到了什么

print 'ValReader'
                         level
Date                          
Date                     level
01.04.2003 00:00:00     200.76
01.05.2003 00:00:00     200.64
01.06.2003 00:00:00     200.53

在此之后,导致级别被处理为字符串。

好的,简单的,CSV中的手动标题行(在以前的版本中运行良好,只需要处理好数据)是罪魁祸首,所以我只需将skiprows设置为skiprows=DateStart+1 ,但结果是

ValueError: Number of passed names did not match number of header fields in the file

所以很明显我完全迷失了pandas如何处理列的名称和位置。

1 个答案:

答案 0 :(得分:0)

我以前也遇到过这个问题,但这是一个解决方案。

解决这个问题的一种方法是 NOT 使用正则表达式解析分隔符,因为这会回退到 python 引擎,而在 C 引擎中,您可以跳过坏线警告,并且可以指定所需的

例如:

In [1]: import io

In [2]: import pandas as pd

In [3]: s = io.StringIO(u'''Stuff
more stuff I dont need
Date;level;crap1;crap2;crap3;crap4;crap5;crap6
01.01.1988 00:00:00   ;   204.87
01.02.1988 00:00:00   ;   204.94
01.03.1988 00:00:00   ;   204.87 ''')
# I use skiprows=2 instead of DateStart here
# after settings error_bad_lines=False, you can parse the csv OK...
In [4]: ValReader = pd.read_csv(s, sep=';', skiprows=2, usecols=['Date', 'level'], 
                                index_col='Date', dayfirst=True, parse_dates=True, 
                                error_bad_lines=False)

In [5]: ValReader
Out[5]:
             level
Date
1988-01-01  204.87
1988-02-01  204.94
1988-03-01  204.87

In [6]: ValReader['level'].dtype
Out[6]: dtype('float64')

希望这有助于解决您遇到的问题。