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

  • 本文关键字:操作 应用于 结果 python pandas
  • 更新时间 :
  • 英文 :


在SQL中,查询看起来像select id, avg(x), avg(y), max(x), max(y) from table group by id可以转换为熊猫数据框上的单个操作吗?我可以得到每个函数的结果,例如

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

但这是对同一操作的过度调用,加上过多的存储需求(mydf 很大)。此外,在最后获得独特的套装有点麻烦。

有什么想法吗?

是的,这是受支持的,请参阅此处的文档。

从那里引用:

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

最新更新