有一个奇怪的.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()...)文件并删除它们的情况下忽略这些行的任何想法?
答案 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
):
知道所需的\ trash数据行的数量。 [手动]
pd.read_csv('file.csv', nrows=3)
或pd.read_csv('file.csv', skipfooter=4)
通过删除DataFrame
中的其他数据来保留所需数据。 [自动]
df.dropna(axis=0, how='any', inplace=True)
结果将是:
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)
然后,使用 isnull
或 isna
方法创建一个仅包含空白行的数据框。这是通过定位(.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]