在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