我有一个大的数据帧(数百万行)。如何有效地遍历连续的熊猫数据帧块
我希望能够对其执行groupby操作,但只是按任意连续(最好是大小相同)的行子集进行分组,而不是使用单个行的任何特定属性来决定它们将转到哪个组。
用例:我想通过IPython中的平行映射将函数应用于每一行。因为函数根据一行中的一行计算结果,所以哪些行将访问哪个后端引擎并不重要。 (从概念上讲至少,在现实中它的矢量。)
我想出这样的事情:
# Generate a number from 0-9 for each row, indicating which tenth of the DF it belongs to
max_idx = dataframe.index.max()
tenths = ((10 * dataframe.index)/(1 + max_idx)).astype(np.uint32)
# Use this value to perform a groupby, yielding 10 consecutive chunks
groups = [g[1] for g in dataframe.groupby(tenths)]
# Process chunks in parallel
results = dview.map_sync(my_function, groups)
但这似乎很啰嗦,但并不保证同等大小的块。特别是如果索引是稀疏或非整数或其他。
任何建议更好的方法?
谢谢!
这就是我想到的!在技术上,“df.groupby(np.arange(len(df))//(len(df)/ 10))”得到固定数量的组(每个核心1个)而不是固定大小。出于某种原因,我并没有想到,分组密钥实际上并不需要与索引完全相关...... – 2014-09-06 18:01:58
值得一提的是,为了提高效率,最好使用“迭代器”来读取原始文件( https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)和“chunksize”,以便read_csv函数执行读取操作,并且每个片段都可以传递到单独的进程,如@Ryan – 2017-11-08 00:01:16