首页 > 解决方案 > 熊猫可以解析带有未知数量评论,标题和要跳过的行的csv文件

问题描述

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

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

有了评论数量的先验知识(这违反了评论的想法),文件可以被 pandas pd.read_csv(fname, header=0, comment='#', skiprows=[3])

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

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)

标签: pandascsvparsingcomments

解决方案


您可以使用header+comment来获取 MultiIndex,然后删除不需要的级别。header在删除评论后评估,所以它总是[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

推荐阅读