同时计算pandas数据帧

Bla*_*ard 6 python concurrency multithreading 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())
Run Code Online (Sandbox Code Playgroud)

然后,

df_final = merge(df_a, df_b) # omitting the irrelevant part
Run Code Online (Sandbox Code Playgroud)

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

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

那怎么能用Python编写呢?我读的文档multiprocessing,threading以及concurrent.futures,但所有的人都对我来说太难以捉摸,我甚至不知道我是否可以使用这些库开始与...

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

谢谢.

Jam*_*bin 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)
Run Code Online (Sandbox Code Playgroud)

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