【问题标题】:Pandas: skip lines containing a certain string when reading a filePandas:读取文件时跳过包含特定字符串的行
【发布时间】:2022-01-28 08:03:01
【问题描述】:

我有一个大文本文件(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?

【问题讨论】:

  • 你对这些行的意图是什么?您还可以使用memory_map 选项来提高加载阶段以及可能的其他阶段/的性能。
  • 为了加快速度,您是否尝试过将 .txt 文件读入文件对象(在这种情况下不是通过 pandas),然后将每一行保存到字符串列表中。将包含“000e”的行添加到列表中时排除它们。甚至可以是一个元组。
  • 然后,如果您的文件需要更多分析,您可以将其保存到数据框并继续。

标签: python pandas


【解决方案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 执行此操作要快得多,即使您决定之后将其加载到 pandas 中。我不知道您的数据是什么样的,但我使用包含 3 列和 100 行的 csv 文件对这些数据进行了测试,我的性能提高了大约 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

【讨论】:

  • 非常感谢!我尝试了方法2,它工作得更快。我现在有一个 1999048 行的 DataFrame,并且在处理我的数据时面临一个新的速度问题。我将发布一个新问题。再次感谢您的回答!
【解决方案2】:

如果您可以访问 linux 或 mac os 系统,您可以在预处理步骤中执行此操作,使用 grep -v 可能会更快,它会返回所有 匹配的行

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

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

findstring /v File.txt > small_file.txt

你可以在你的 python 代码中调用 os 命令,见here

如果你想让它能够处理多个操作系统,请参阅here

【讨论】:

    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多