6

在 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函数 in multiprocessing),如果我理解正确的话(我不确定我理解正确,如果我错了,请纠正我! )。

但是,我想要实现的只是同时运行这三个(实际上是更多)并最终将它们合并在一起,一旦数据帧上的所有计算都成功完成。Go我假设在(goroutines和)中实现的那种功能channels,可能是分别创建每个函数,一个接一个地同时运行它们,等待它们全部完成,最后将它们合并在一起。

那么如何用 Python 编写呢?我阅读了、 和的文档multiprocessing,但所有这些对我来说都太难以捉摸了,我什至不明白我是否可以从一开始就利用这些库......threadingconcurrent.futures

(为了简洁起见,我把代码写得很精确,实际代码更复杂,所以请不要回答“是的,你可以用非并发的方式写成一行”之类的。)

谢谢。

4

1 回答 1

11

9 个月后,这仍然是使用多处理和 pandas 的最佳结果之一。我希望你在这一点上找到了某种类型的答案,但如果没有,我有一个似乎可以工作的答案,希望它能帮助其他看到这个问题的人。

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)

至少我希望这对将来正在研究这些东西的人有所帮助

于 2014-08-12T20:27:38.283 回答