熊猫:读取文件时跳过包含特定字符串的行

时间:2019-03-28 18:25:30

标签: python pandas

我有一个大文本文件(300000000行),但其中充满了不希望的数据,但我想将其删除。这些数据是包含字符串“ 0000e”的数据。

我尝试过:

f=pd.read_csv('File.txt', skiprows=139, header=None, index_col=False)
f=f.iloc[:,0]
f1=f[f.str.contains("0000e")==False]

f=pd.read_csv('file.txt', skiprows=139, header=None, index_col=False, chunksize=50)
dfs = pd.concat([x[x[0].str.endswith('000e')==False] for x in f])

但是它很长,有没有一种更快的方法来跳过某些包含特定字符串的行?包含na_values吗?

2 个答案:

答案 0 :(得分:1)

我更喜欢您的第一次尝试,因为它的第二行带有x且我不知道它们指的是什么,它绝对更具可读性。

也就是说,使用memory_map=True可以提高文档中提到的性能 ,您还可以通过删除第二行并访问与您所在行相同的列来获得额外的优势创建df。最后,用...==False代替支票~...可能会带来一些好处。因为~是逻辑not,但是您需要过滤掉所有NaN的值,否则会出错。幸运的是,Series.str.contains接受并将na属性应用于给定的函数到NaN的值。

import pandas as pd

df = pd.read_csv('File.txt', memory_map=True, header=None, index_col=False).iloc[:,0]
df1 = df[~df.str.contains("test", na=False)]
#if you want to also skip NaN rows use the below statement
df1 = df[~df.str.contains("test", na=False)].dropna()

或者,使用csv进行此操作要快得多,即使您以后决定将其加载到熊猫中也是如此。我不知道您的数据是什么样子,但是我使用csv文件测试了这些数据,该文件包含3列100行,并且性能提高了大约9倍。这可能与您的结果无关,但这绝对是如果您是我会选择的方法。

from csv import reader

filter = '0000e' #so we aren't making a new string every iteration
with open('File.txt', 'r') as f:
  df = pd.DataFrame(first for first, *_ in reader(f) if filter not in first)
  #if you want to skip NaN rows
  ...(first for first, *_ in reader(f) if not first and filter not in first)
  #take note this also skips empty strings, use if first is not None for only skipping NaN values

答案 1 :(得分:0)

如果您可以访问linux或mac os系统,则可以在预处理步骤中执行此操作,而使用unlist(df_spl) 可能会更快,该操作会返回所有的行>匹配

grep -v

在Windows上(我认为)是findstring /v

grep -v 0000e File.txt > small_file.txt

您可以从python代码内部调用os命令,请参见here

,如果您想使其能够处理多个操作系统,请参见here