58

我想我误解了 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

4

3 回答 3

58

所以我相信在最新版本的熊猫(版本 0.16.0)中,您可以将comment='#'参数放入pd.read_csv其中,这应该跳过注释掉的行。

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

请参阅以下文档read_csv: http: //pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

于 2015-08-11T00:19:13.540 回答
19

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

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 中的情况,我已经提交了一个错误报告

正如 Viktor 指出的那样,您可以在事后使用 dropna 删除 NaN ......(最近有一个开放的问题是完全忽略注释行):

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

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

于 2013-08-21T20:20:22.847 回答
3

我在 Pandas 版本 0.13.1 上,这个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。

于 2014-05-12T09:09:16.290 回答