【问题标题】:pandas.read_csv: how to skip comment linespandas.read_csv:如何跳过注释行
【发布时间】:2013-08-24 09:04:33
【问题描述】:

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

【问题讨论】:

  • 什么是'j'?用 csv 文件路径替换 'j' 时,我无法重现错误。
  • 你试过df = pandas.read_csv('j', comment='#')
  • 抱歉,b'#' 是一个错字。 'j' 是一个示例文件。这是 Andy Hayden 在下面提到的一个错误。
  • @mathtick 奇怪的是,我在上面的代码中得到了稍微不同的错误,但我有 posted an issue 与你在 github 上描述的 CParserError,我认为这是一个错误。
  • @AndyHayden ...是的,当我匆忙时,我从加载与示例中所示不同的文件中获取了错误。只是试图在家里重现它,发现行为似乎已经稍微改变了较新的版本(在'0.12.0-199-g4c8ad82'上测试)。我已经更新了示例。

标签: python pandas


【解决方案1】:

我使用的是 Pandas 0.13.1 版,这个 cmets-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。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      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
      

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

      【讨论】:

      • 而且由于您不想要注释行,只需在之后调用.dropna(how='all').reset_index(drop=True)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2021-12-01
      • 2012-12-18
      • 1970-01-01
      • 2021-12-01
      • 2020-01-18
      相关资源
      最近更新 更多