假设您有以下SQL表:
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
并且您希望为列B的每个不同值添加/显示包含列A的平均值(或任何其他聚合函数)的列。您希望保留所有列。所以结果看起来像这样:
>>> 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
据我所知,大熊猫最好的方法是:
import numpy as np
from itertools import combinations
t = np.random.rand(4,3) # dummy example np.array
n_cols = t.shape[1] # number of columns
# all the combinations in a tuple:
combs = tuple( t[:, comb] for n in range(n_cols+1) for comb in combinations(range(n_cols), n) )
你会在SQL中做到这一点?可以避免使用JOIN吗?
答案 0 :(得分:2)
您可以加入包含每个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