同时计算pandas数据帧

时间:2013-11-08 00:32:58

标签: python multithreading concurrency multiprocessing

是否可以同时在pandas中的数据框中进行多个分组计算并获得这些结果?所以,我想计算以下数据帧集并逐个获得这些结果,最后将它们合并到一个数据帧中。

df_a = df.groupby(["state", "person"]).apply(lambda x: np.mean(x["height"]))
df_b = df.groupby(["state", "person"]).apply(lambda x: np.mean(x["weight"]))
df_c = df.groupby(["state", "person"]).apply(lambda x: xp["number"].sum())

然后,

df_final = merge(df_a, df_b) # omitting the irrelevant part

但是,据我所知,multiprocessing的那些功能在这里并不符合我的需要,因为它看起来更像是同时运行多个函数而不返回内部创建的局部变量,并且而只是在函数内打印一些输出(例如经常使用的is_prime函数),或者同时运行具有不同参数集的单个函数(例如map中的multiprocessing函数),如果我正确地理解它(我不确定我是否理解正确,如果我错了,请纠正我!)。

然而,我想要实现的只是同时运行这三个(实际上,更多)并最终将它们合并在一起,一旦数据帧上的所有计算都成功完成。我假设在Gogoroutineschannels)中实现的功能类型,可能分别创建每个函数,逐个运行它们,同时等待所有这些函数完成,最后将它们合并在一起。

那怎么能用Python编写呢?我阅读了multiprocessingthreadingconcurrent.futures的文档,但所有这些对我来说都太难以捉摸了,我甚至不明白我是否可以利用这些库来开始...

(为了简洁起见,我使代码精确,实际代码更复杂,所以请不要回答“是的,你可以用一行和非并发方式写”或类似的东西。 )

感谢。

1 个答案:

答案 0 :(得分:8)

9个月后,这仍然是处理多处理和熊猫的最佳结果之一。我希望你在这一点上找到了某种答案,但如果没有,我会找到一个似乎有效的答案,希望它能帮助那些看到这个问题的人。

import pandas as pd
import numpy as np
#sample data
df = pd.DataFrame([[1,2,3,1,2,3,1,2,3,1],[2,2,2,2,2,2,2,2,2,2],[1,3,5,7,9,2,4,6,8,0],[2,4,6,8,0,1,3,5,7,9]]).transpose()
df.columns=['a','b','c','d']
df

   a  b  c  d
0  1  2  1  2
1  2  2  3  4
2  3  2  5  6
3  1  2  7  8
4  2  2  9  0
5  3  2  2  1
6  1  2  4  3
7  2  2  6  5
8  3  2  8  7
9  1  2  0  9


#this one function does the three functions you had used in your question, obviously you could add more functions or different ones for different groupby things
def f(x):
    return [np.mean(x[1]['c']),np.mean(x[1]['d']),x[1]['d'].sum()]

#sets up a pool with 4 cpus
from multiprocessing import Pool
pool = Pool(4)

#runs the statistics you wanted on each group
group_df = pd.DataFrame(pool.map(f,df.groupby(['a','b'])))
group_df
   0         1   2
0  3  5.500000  22
1  6  3.000000   9
2  5  4.666667  14

group_df['keys']=df.groupby(['a','b']).groups.keys()

group_df
   0         1   2    keys
0  3  5.500000  22  (1, 2)
1  6  3.000000   9  (3, 2)
2  5  4.666667  14  (2, 2)

至少我希望这可以帮助那些在将来看这些东西的人