Pandas:read_csv在空行后忽略行

时间:2016-12-08 17:37:07

标签: python pandas

有一个奇怪的.csv文件,类似于:

header1,header2,header3
val11,val12,val13
val21,val22,val23
val31,val32,val33

非常好,但在这些线之后,总会出现一个空白行,后面跟着许多无用的行。整个过程都是一致的:

header1,header2,header3
val11,val12,val13
val21,val22,val23
val31,val32,val33

dhjsakfjkldsa
fasdfggfhjhgsdfgds
gsdgffsdgfdgsdfgs
gsdfdgsg

底部的行数是完全随机的,唯一的注释是它们之前的空行。

Pandas有一个参数“skipfooter”,用于忽略页脚中已知的行数。

有关如何在不实际打开(open()...)文件并删除它们的情况下忽略这些行的任何想法?

3 个答案:

答案 0 :(得分:2)

如果您正在使用csv模块,则检测空行非常简单。

import csv 

with open(filename, newline='') as f:
    r = csv.reader(f)
    for l in r:
        if not l:
            break
        #Otherwise, process data

答案 1 :(得分:2)

通过获取第一个空行,没有任何选项可以终止read_csv功能。该模块不能根据所需条件接受/拒绝线路。它只能忽略空行(可选)或不符合形成的数据形状的行(具有更多分隔符的行)。

您可以通过以下方法规范化数据(无需解析文件 - 纯pandas):

  1. 知道所需的\ trash数据行的数量。 [手动]

    pd.read_csv('file.csv', nrows=3)pd.read_csv('file.csv', skipfooter=4)

  2. 通过删除DataFrame中的其他数据来保留所需数据。 [自动]

    df.dropna(axis=0, how='any', inplace=True)

  3. 结果将是:

      header1 header2 header3
    0   val11   val12   val13
    1   val21   val22   val23
    2   val31   val32   val33
    

答案 2 :(得分:1)

使用 Pandas 原生函数的最佳方法是参数和函数调用的组合 - 有点乱,但绝对有可能!

首先,使用 read_csv 调用 skip_blank_lines=False,因为默认值为 True

df = pd.read_csv(<filepath>, skip_blank_lines=False)

然后,使用 isnullisna 方法创建一个仅包含空白行的数据框。这是通过定位.loc)所有值为空/空白的索引来实现的。

blank_df = df.loc[df.isnull().all(1)]

利用此数据框保留原始索引的事实,您可以获得第一个空白行的索引。

因为这使用了索引,您还需要检查 csv 中是否确实有一个空行。最后,您只需切片原始数据帧以删除不需要的行。

if len(blank_df) > 0:
    first_blank_index = blank_df.index[0]
    df = df[:first_blank_index]