假设您具有以下SQL表:
A B C
2 1 4
3 4 5
3 1 1
1 4 0
5 0 1
并且您想要添加/显示一列,其中包含B列的每个不同值的A列的平均值(或任何其他聚合函数)。您想保留所有列。因此结果将如下所示:
A B C avg(A)|B
2 1 4 2.5
3 4 5 2.0
3 1 1 2.5
1 4 0 2.0
5 0 1 5.0
据我所知,在熊猫中做到这一点的最好方法是:
>>> df['avg(A)|B'] = df.groupby('B')['A'].transform('mean')
>>> df
A B C avg(A)|B
0 2 1 4 2.5
1 3 4 5 2.0
2 3 1 1 2.5
3 1 4 0 2.0
4 5 0 1 5.0
您将如何在SQL中做到这一点?可以避免使用JOIN吗?
最佳答案
您可以加入一个派生表,该表包含每个b组的合计值
select * from mytable t1
join (
select avg(a), b
from mytable
group by b
) t2 on t2.b = t1.b
或使用子查询
select *, (select avg(a) from mytable t2 where t2.b = t1.b)
from mytable t1
这个问题同时被标记为mysql和psql,所以我不确定您使用的是哪个数据库。但是在postgres上,您可以使用窗口函数
select *, avg(a) over (partition by b)
from mytable
关于mysql - 与pandas'transform'等效的SQL是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33730092/