Pandas:read_csv忽略空行后的行

2skhul33  于 2023-03-06  发布在  其他
关注(0)|答案(3)|浏览(346)

有一个奇怪的.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()...)文件并删除它们吗?

ego6inou

ego6inou1#

read_csv函数没有取第一个空行来终止的选项,本模块不能根据需要的条件接受/拒绝行,只能忽略空行(可选)或不符合数据形成形状的行(分隔符较多的行)。
您可以通过以下方法规范化数据(无需解析文件-pure pandas):
1.知道所需的\trash数据行数。[手动]
pd.read_csv('file.csv', nrows=3)pd.read_csv('file.csv', skipfooter=4)
1.通过删除DataFrame中的其他数据来保留所需数据。[自动]
df.dropna(axis=0, how='any', inplace=True)
结果将是:

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

ycl3bljg2#

解决方案:

df = pd.read_csv(<filepath>, skip_blank_lines=False)
blank_df = df.loc[df.isnull().all(1)]
if len(blank_df) > 0:
    first_blank_index = blank_df.index[0]
    df = df[:first_blank_index]

说明:

使用panda原生函数来实现这一点的最佳方法是参数和函数调用的组合--有点混乱,但绝对可行!
首先,使用skip_blank_lines=False调用read_csv,因为缺省值是True

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

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

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

通过利用这个 Dataframe 保留原始索引的事实,您可以获得第一个空行的索引。
因为这使用了索引,所以您还需要检查csv中是否确实有空行。最后,您只需将原始 Dataframe “切片”以删除不需要的行。

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

p3rjfoxz3#

如果您使用的是csv模块,那么检测一个空行是非常简单的。

import csv 

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

相关问题