在python中对大型csv文件中的行进行迭代的最佳方法是写入新的行

2024-05-23 17:43:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个比较python的新手,试图高效地浏览大约800万行的大型csv文件

我有一个6列的csv:

+-------+-------+--------+-------+--------+----------+
| Gene1 | Start |  End   | Gene2 | Start  |   End    |
+-------+-------+--------+-------+--------+----------+
| gyrA  |    33 |    193 | dnaB  |    844 |      965 |
| rpoS  |   152 |    190 | ldh   |    200 |      264 |
| gbpC  |   456 |    500 | bgl   |   1222 |    14567 |
+-------+-------+--------+-------+--------+----------+

…等等,共8000000行

我想做的是比较Gene2的开始和结束是否在一定范围内+/-Gene1的开始和结束。例如,我想看看Gene1的结尾是否在Gene2开始的20范围内。然后,我想将所有符合此条件的行写入一个新的csv文件

代码: 如果Gene1的结尾在Gene2开头的+/-20范围内,则将整行追加到新文件中

输出:

+-------+-------+--------+-------+-------+--------+
| Gene1 | Start |  End   | Gene2 | Start |  End   |
+-------+-------+--------+-------+-------+--------+
| rpoS  |   152 |    190 | ldh   |   200 |    264 |
+-------+-------+--------+-------+-------+--------+

对于python新手来说,最有效的方法是什么?我将不得不在多个csv上多次运行代码,因此我担心速度。我尝试过与pandas混在一起,但似乎itterrows()函数不是提高效率的建议方法。我想我可以用csv阅读器很容易地完成这项工作,但我不确定这可能需要多长时间

谢谢你帮我解决这个问题


Tags: 文件csv方法代码结尾startend新手
2条回答

许多操作是矢量化的。你很难自己快速地写一些更有表现力的东西:

df = pd.read_csv('large.csv')

  Gene1  Start  End Gene2  Start.1  End.1
0  gyrA     33  193  dnaB      844    965
1  rpoS    152  190   ldh      200    264
2  gbpC    456  500   bgl     1222  14567

返回布尔级数的条件:

abs(df.End - df['Start.1']) <= 20

0    False
1     True
2    False

按布尔序列筛选数据帧:

df[abs(df.End - df['Start.1']) <= 20]

  Gene1  Start  End Gene2  Start.1  End.1
1  rpoS    152  190   ldh      200    264

查看Getting Started页面了解更多信息

我们可以使用chunksize来使用生成器表达式,一次处理多行并将其写入csv。分块执行此操作可以避免耗尽所有ram

另一个选项是使用Dask,您可以在上面阅读

首先,我们创建一个空白csv,其中包含要写入的目标标题

header_df = pd.read_csv(yourfile,nrows=1)

header_df.iloc[:0].to_csv('target_file',index=False)

chunksize = 5 * 10000 #50k rows.

for chunk in pd.read_csv(your_file,chunksize=chunksize):
#your etl logic.
#assuming your final variable is called target df.
    target_df.to_csv(target_file, mode='a', header=False,index=False)

相关问题 更多 >