我有一个大型数据帧(几百万行) .
我希望能够对它进行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)
但这似乎很啰嗦,并不能保证大小相等 . 特别是如果索引是稀疏的或非整数的或其他什么 .
有什么更好的方法吗?
谢谢!
4 回答
在实践中,你不能保证大小相等的块:毕竟,行数可能是素数,在这种情况下,你的唯一分块选项是大小为1或大块的块 . 我倾向于将数组传递给
groupby
. 从...开始:我故意通过将索引设置为0来使索引无法提供信息,我们只是决定我们的大小(这里是10)并按它对整数除以一个数组:
虽然您始终可以使用
.iloc[a:b]
来忽略索引值并按位置访问数据,但基于切片DataFrame的方法可能会在索引与此不兼容时失败 .我不确定这是否正是你想要的,但我发现another SO thread上的这些分组函数对于执行多处理器池非常有用 .
这是该线程的一个简短示例,它可能会执行您想要的操作:
这给你这样的东西:
我希望有所帮助 .
编辑
在这种情况下,我以(大约)这种方式使用pool of processors这个函数:
我认为这应该与使用IPython分布式机器非常相似,但我还没有尝试过 .
使用numpy有这个内置:np.array_split()
良好环境的标志是很多选择,所以我将从Anaconda Blaze添加,真的使用Odo