什么是与熊猫变换相当的SQL?

时间:2015-11-16 07:12:46

标签: mysql sql pandas psql

假设您有以下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吗?

1 个答案:

答案 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