如何将函数并行应用于多个数据帧子集?

时间:2018-08-01 13:16:40

标签: python python-3.x dataframe optimization parallel-processing

我在这里向经验丰富的用户寻求建议。我没有遇到“我的代码无法正常工作,您能帮我解决这个问题吗?”之类的问题。而是出现“我想这样做,我应该怎么做?”之类的问题。 在来到这里问这个问题之前,我开始做一些研究,但是我找不到任何适合我情况的东西(最后列出了我在做一些研究时得到的想法)。

在描述自己的情况时,我尽量保持清晰,但不要犹豫,向我询问更多精确度。

话虽如此,这是主要话题。

我在做什么:

我有两个数据框,一个是data,其中包含我的实验数据,另一个是reference,其中包含我的参考数据。我有一个match_function,可让我将data中的行与reference中的行进行比较,以确定我的实验数据是否可以与我拥有的参考数据匹配,并且返回一个概括结果的数据框。到目前为止一切顺利。

我想做什么:

但是,数据中的每一行只能与reference中的几行匹配(比方说,参考的35K行中的1-50行之间)。因此,我想避免在我知道永远不会匹配的行之间进行比较。我做了一些测试:

  • 如果我尝试将数据中的400行与整个reference数据帧(35K行)进行匹配,则大约需要1分钟30秒。
  • 如果仅使用它们可能与之匹配的22个参考行来执行此操作,则只需要70毫秒。

因此,我们的想法是根据一些特征,将我的数据帧分成“块”,这些特征可以告诉我它们可能与哪些reference行匹配。而不是一次完成所有操作:

match_function(data, reference)
>>> match_data 

我可以在每个数据框的“块”之间进行比较,以便将它们进行比较,然后将结果数据框串联起来。

match_function(data_a, reference_a)
>>> match_data_a

match_function(data_b, reference_b)
>>> match_data_b

match_function(data_c, reference_c)
>>> match_data_b

match_data = pd.concat([match_data_a, match_data_b, match_data_c])

现在我想可以做到这一点,方法是先拆分每个数据帧,然后使用嵌套的for循环遍历它们,以便将它们用作我的函数中的输入。但是我认为这会相当慢。因此,我不想串联进行每个比较,而是想通过并行进行比较来加快整个过程。

现在,如果我错了,请纠正我,但是如果我们假设整个过程将花费1h进行意甲中的所有比较,那么如果我可以同时进行两个比较,则将“仅”花费30分钟。同时。如果我可以同时进行4次比较,则为15分钟,依此类推。

问题:

  1. 这样做是明智的吗?如果是的话,很容易做到吗?
  2. 解决此问题的最佳解决方案(工具或方法)是什么?

我到目前为止的想法:

在开始提问之前,我开始做一些研究,但根据我的理解,找不到适合我情况的答案

  • 在python中进行多重处理非常容易。但是我找不到一个示例,其中每个过程中的“输入”是不同的数据帧。也许map()可以通过在拆分后将不同数据帧的名称传递给它来实现?

  • Dask允许通过首先将数据帧分成给定大小的块来进行并行计算,然后每个进程负责对一个块进行计算,并在处理每个块时返回结果。基本上看起来像我想做的,但是我需要“控制”如何将数据帧拆分为较小的数据帧。


如果这不是问这样的问题的好地方,我事先表示歉意,如果您能引导我去一个更合适的地方讨论这个问题,我将不胜感激。

感谢您的阅读。

0 个答案:

没有答案