pandas.read_csv:如何跳过评论行

时间:2013-08-21 20:13:27

标签: python pandas

我想我误解了read_csv的用意。如果我有一个文件' j'像

# notes
a,b,c
# more notes
1,2,3

我怎么能pandas.read_csv这个文件,跳过任何'#'评论线?我在帮助&评论'不支持行,但它表示应返回空行。我看到一个错误

df = pandas.read_csv('j', comment='#')

CParserError:标记数据时出错。 C错误:第2行预期有1个字段,见3

我目前正在

In [15]: pandas.__version__
Out[15]: '0.12.0rc1'

在版本' 0.12.0-199-g4c8ad82':

In [43]: df = pandas.read_csv('j', comment='#', header=None)

CParserError:标记数据时出错。 C错误:第2行预期有1个字段,见3

3 个答案:

答案 0 :(得分:27)

所以我相信最新版本的pandas(版本0.16.0),您可以将PyErr_Occurred参数放入comment='#',这应该跳过注释掉的行。

这些github问题表明你可以这样做:

请参阅pd.read_csv上的文档:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

答案 1 :(得分:11)

一种解决方法是指定省略前几个条目:

In [11]: s = '# notes\na,b,c\n# more notes\n1,2,3'

In [12]: pd.read_csv(StringIO(s), sep=',', comment='#', skiprows=1)
Out[12]: 
    a   b   c
0 NaN NaN NaN
1   1   2   3

否则read_csv会有点困惑:

In [13]: pd.read_csv(StringIO(s), sep=',', comment='#')
Out[13]: 
        Unnamed: 0
a   b            c
NaN NaN        NaN
1   2            3

这似乎是0.12.0中的情况,我已经提交了a bug report

正如Viktor所指出的,你可以在事后使用dropna删除NaN ......(有一个recent open issue可以完全忽略注释行):

In [14]: pd.read_csv(StringIO(s2), comment='#', sep=',').dropna(how='all')
Out[14]: 
   a  b  c
1  1  2  3

注意:默认索引将“放弃”缺少数据的事实。

答案 2 :(得分:2)

我在Pandas版本0.13.1上,这个 comments-in-csv 问题仍困扰着我。

以下是我目前的解决方法:

def read_csv(filename, comment='#', sep=','):
    lines = "".join([line for line in open(filename) 
                     if not line.startswith(comment)])
    return pd.read_csv(StringIO(lines), sep=sep)

否则pd.read_csv(filename, comment='#')我得到

  

pandas.parser.CParserError:标记数据时出错。 C错误:第16行预计有1个字段,见3。