python-将操作应用于结果中具有多个列的多个列

在sql中,查询看起来像是按ID从表组中选择id,avg(x),avg(y),max(x),max(y)
是否可以将其转换为对 pandas 数据帧的单个操作?
我可以得到每个函数的结果

mydf['center_x'] =  mydf.groupby('id')['x'].mean()
mydf['center_y'] =  mydf.groupby('id')['y'].mean()

等等

但这是对同一操作的过多调用,再加上过多的存储需求(mydf很大).此外,在最后获得唯一的设置有点麻烦.

有任何想法吗?

最佳答案

是的,这受支持,请参阅文档here.

从那里引用:

In [56]: grouped = df.groupby('A')

In [57]: grouped['C'].agg([np.sum, np.mean, np.std])
Out[57]: 
          sum      mean       std
A                                
bar  0.443469  0.147823  0.301765
foo  2.529056  0.505811  0.966450

也许与您的问题更相关,您还可以为不同的列执行不同的功能,如下所示:

In [60]: grouped.agg({'C' : np.sum,
   ....:              'D' : lambda x: np.std(x, ddof=1)})
   ....: 
Out[60]: 
            C         D
A                      
bar  0.443469  1.490982
foo  2.529056  0.645875

或者,是一个更接近您原始问题的实际示例:

df = pd.DataFrame({"group":list("aaaaabbbbb"), "A":np.random.rand(10), "B":np.random.rand(10)})
df.groupby("group").agg({"A":[np.sum, np.mean], "B":[np.sum, np.mean]})


    A               B
    sum     mean    sum     mean
group               
a   1.450488    0.290098    3.526962    0.705392
b   1.570386    0.314077    2.734465    0.546893