在python中对大型csv文件中的行进行迭代的最佳方法是写入新的行
我是一个比较python的新手,试图高效地浏览大约800万行的大型csv文件 我有一个6列的csv:在python中对大型csv文件中的行进行迭代的最佳方法是写入新的行,python,pandas,loops,csv,Python,Pandas,Loops,Csv,我是一个比较python的新手,试图高效地浏览大约800万行的大型csv文件 我有一个6列的csv: +-------+-------+--------+-------+--------+----------+ | Gene1 | Start | End | Gene2 | Start | End | +-------+-------+--------+-------+--------+----------+ | gyrA | 33 | 193 | dnaB |
+-------+-------+--------+-------+--------+----------+
| 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阅读器很容易地完成这项工作,但我不确定这可能需要多长时间
谢谢你帮我解决这个问题 许多操作都是矢量化的。你很难自己快速地写一些更有表现力的东西:
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
abs(df.End-df['Start.1'])许多操作都是矢量化的。你很难自己快速地写一些更有表现力的东西:
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
abs(df.End-df['Start.1'])我们可以使用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)
我们可以使用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)