gpt4 book ai didi

python - 加载 txt 文件时跳过行

转载 作者:行者123 更新时间:2023-12-04 14:57:49 26 4
gpt4 key购买 nike

我有大约 8000 个基本上是 .txt 文件的 gzip 文件。每个文件包含大约 500 万行的内容。此外,每行有 7 列或 10 列。列数由一列定义,其值分别为 -1 或 1。

问题是我需要加载所有文件,进行一些过滤(因为我不需要每个文件中的所有内容),然后最后连接所有内容以进行最终分析。

我现在做的是这样的:

gz = gzip.open(f'{path}/{filename}')
df = pd.read_csv(gz, delimiter="\t")

这是迄今为止我执行的所有步骤中耗时最长的一步。读取一个 500 万行的 gzip 文件。在这种情况下,每个文件大约需要 15 秒。但是,我事先知道我需要从文件中获取的东西在我上面谈到的特定专栏中是 -1 还是 1。并过滤掉所有那些例如not -1 我可以这样做:

df = df[df["col1"] != 1] 

但这发生在我加载了整个文件之后。根据它是 -1 还是 1,数据分别减少了 25% 或 75%。

同样,由于“瓶颈”是 read_csv 部分,我认为通过不加载 25% 或 75% 的数据可以减少加载时间。因为加载所有内容时 df = df[df["col1"] != 1] 只需要 ms 或其他时间。

那么有没有什么方法可以在加载时过滤掉这些特定的行,或者根本不会带来任何明显的性能提升?还是有更智能的方式来更快地加载它?

最佳答案

作为第一个选项,您可以只读取“过滤器”列并确定要保留的行:

df = pd.read_csv('path', usecols='col')

selector = df[df['col'] != 1].index
df = pd.read_csv('path', skiprows=selector)

作为第二个选项,您可以分块读取数据并过滤每个 block :

lst = []
for chunk in pd.read_csv('path', chunksize=1000):
chunk = chunk[df['col'] != 1]
lst.append(chunk)

df = pd.concat(lst)

关于python - 加载 txt 文件时跳过行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67604103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com