我有一个像下面这样的玩具数据集。
Building Department feature1 feature2
0 A 1 14 28
1 A 1 11 26
2 A 1 29 19
3 A 2 26 28
4 A 2 22 27
5 A 2 20 24
6 A 2 15 14
7 A 2 30 21
8 A 3 30 15
9 A 3 16 29
10 A 3 25 23
11 A 3 26 15
12 A 3 11 11
我想计算这些变量:Score1
这是feature1
的平均值和 feature2
对于那个部门(扁平化并做平均,没有花哨的东西)Score2
这是feature1
的平均值和 feature2
这是不包括该部门(即焦点小组)的平均值。 所以,对于
Department
1 Score1
将根据 Department
计算1 平均但 Score2
将根据 Department
计算2 和 3。最后结果:
Building Department Score1 Score2
0 A 1 21.16 21.400
1 A 2 22.70 20.500
2 A 3 20.10 22.125
我找不到任何 pandas
这种“排除”的快捷方式。一种可能的解决方案是循环遍历组并像这样计算它,但是我的数据对于这样的循环来说太大了。任何帮助,提示表示赞赏!谢谢
最佳答案
你可以做:
# stack to reshape the dataframe
s = df.set_index(['Building', 'Department']).stack()
# groupby and aggregate
m1 = s.groupby(level=[0, 1]).agg(['sum', 'count'])
m2 = s.groupby(level=0).agg(['sum', 'count']) - m1
# compute mean=sum/count and concatenate along axis=1
out = pd.concat([m1['sum'] / m1['count'], m2['sum'] / m2['count']],
axis=1, keys=['Score1', 'Score2']).reset_index()
详情:先设置
building
和 department
作为数据帧和堆栈的索引以 reshape 以展平特征:# s
Building Department
A 1 feature1 14
feature2 28
feature1 11
feature2 26
feature1 29
feature2 19
2 feature1 26
feature2 28
feature1 22
feature2 27
feature1 20
feature2 24
feature1 15
feature2 14
feature1 30
feature2 21
3 feature1 30
feature2 15
feature1 16
feature2 29
feature1 25
feature2 23
feature1 26
feature2 15
feature1 11
feature2 11
groupby
使用 sum
的堆叠数据框和聚合和 count
:# m1 : sum and count per building and department
sum count
Building Department
A 1 127 6
2 227 10
3 201 10
# m2 : sum and count per building - m1
sum count
Building Department
A 1 428 20
2 328 16
3 354 16
计算 m1
的平均值 (Score1) 和 m2
(Score2) 通过分栏sum
与 count
并沿 axis=1
连接这些平均值得到想要的结果:# out
Building Department Score1 Score2
0 A 1 21.166667 21.400
1 A 2 22.700000 20.500
2 A 3 20.100000 22.125
关于python - Pandas groupby 多个聚合,不包括焦点组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65409492/