除了本帖中的众多优秀答案外,我要提出“分而治之”的方法。我写这篇答案并非要废除其他优秀答案,而是想用另一种方法来补充它们,这种方法对我来说效率很高。它有两个步骤:拆分和合并pandas数据框。
“分而治之”方法的优点:
- 你不需要使用向量化或任何其他方法将数据框的类型转换为另一种类型。
- 你不需要将代码Cython化,这通常会花费额外的时间。
- 在我的情况下,`iterrows()`和`itertuples()`两者在整个数据框上的性能相同。
- 取决于你选择切片的索引,你将能够指数级加快迭代速度。索引越高,迭代过程就越快。
“分而治之”方法的缺点:
- 你不应该依赖于迭代过程对同一数据框和不同的“切片”。也就是说,如果你想从其他“切片”读取或写入内容,可能会很困难。
=================== 分治法 =================
步骤1:分割/切片
在这个步骤中,我们将对整个数据框进行迭代的划分。想象一下,您将把 CSV 文件读入 Pandas 数据框中,然后进行迭代。在我的案例中,我有 5,000,000 条记录,我将把它分成 100,000 条记录。
注意: 我需要再次说明,根据本页其他解决方案所解释的其他运行时分析,“记录数”与 df 搜索的“运行时间”呈指数比例关系。根据我数据的基准测试结果,如下:
Number of records | Iteration rate [per second]
========================================
100,000 | 500
500,000 | 200
1,000,000 | 50
5,000,000 | 20
步骤2:合并
这将是一个简单的步骤,只需将所有编写的CSV文件合并到一个数据帧中,并将其写入一个更大的CSV文件中。
以下是示例代码:
import pandas as pd
df_all = pd.read_csv('C:/KtV.csv')
df_index = 100000
df_len = len(df)
for i in range(df_len // df_index + 1):
lower_bound = i * df_index
higher_bound = min(lower_bound + df_index, df_len)
df = df_all[lower_bound:higher_bound].copy()
'''
Write your iteration over the sliced df here
using iterrows() or intertuples() or ...
'''
df.to_csv('C:/KtV_prep_' + str(i) + '.csv')
filename = 'C:/KtV_prep_'
df = (pd.read_csv(f) for f in [filename + str(i) + '.csv' for i in range(ktv_len // ktv_index + 1)])
df_prep_all = pd.concat(df)
df_prep_all.to_csv('C:/KtV_prep_all.csv')
参考资料:
高效迭代DataFrame数据的方法
将CSV文件合并为一个Pandas DataFrame
pandas
也是读取csv文件的首选。使用API来操作数据更加易于编程。 - F.S.