【问题标题】:Can pandas parse csv file with unknown number of comments, a header and line(s) to be skipped熊猫可以解析带有未知数量评论,标题和要跳过的行的csv文件
【发布时间】:2020-01-06 17:46:34
【问题描述】:

我有一个包含未知数量的 cmets 的文件,后跟一个标题,然后是与数据类型有关的第二行,但对我来说实际上只是垃圾。

# Comment Line 
# Another comment -- there could be lots
index value
not wanted
1 10
2 20

通过对 cme​​ts 数量的先验知识(这有点违反 cmets 的想法),可以通过以下方式读取文件 pandas pd.read_csv(fname, header=0, comment='#', skiprows=[3])

不过,就我而言,数字 3 是未知的。我只知道标题是索引 0,不计算 cmets,我知道不需要的行是索引 1,不计算 cmets。 header 按我想要的方式工作,但不是 skiprows。有没有办法利用这些信息轻松读取文件? “容易”是指以下内容,即打开文件,计算初步的 cmets,然后读取:

ncomment = 0
crows = []
fname = "sample.csv"
with open(fname,"r") as f:
    while f.readline().startswith("#"):
        crows.append(ncomment)
        ncomment += 1
crows = crows + [ncomment+1]
data = pd.read_csv(fname,header=0,skiprows = crows, index_col=0,delim_whitespace = True)
print(data)

【问题讨论】:

    标签: pandas csv parsing comments


    【解决方案1】:

    您可以使用header + comment 来获取 MultiIndex,然后删除不需要的级别。 header 在 cmets 被移除后进行评估,因此它始终为 [0, 1]。 (我使用delim_whitespace=True,因为您的示例数据中没有任何','s)。

    df = pd.read_csv('sample.csv', comment='#', header=[0, 1], delim_whitespace=True)
    #  index  value
    #    not wanted
    #0     1     10
    #1     2     20
    

    我们可以放在同一行:

    df = (pd.read_csv('sample.csv', comment='#', header=[0, 1], delim_whitespace=True)
            .droplevel(1, axis=1))
    #   index  value
    #0      1     10
    #1      2     20
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多