我如何在python-pandas中平均ACROSS组?

时间:2016-09-15 22:49:15

标签: python pandas

我有这样的数据集:

Participant   Type   Rating 
1              A       6
1              A       5
1              B       4
1              B       3
2              A       9
2              A       8
2              B       7
2              B       6

我想获得这个:

Type   MeanRating
A        mean(6,9)
A        mean(5,8)
B        mean(4,7)
B        mean(3,6)

因此,对于每种类型,我想要每组中较高值的平均值,然后是每组中第二个较高值的平均值等。

我无法想出用python pandas做到这一点的正确方法,因为这些方法似乎总是在组内应用,但不适用于它们。

1 个答案:

答案 0 :(得分:6)

首先使用groupby.rank创建一个允许您对齐最高值,第二高值等的列。然后使用新创建的列执行另一个groupby来计算均值:

# Get the grouping column.
df['Grouper'] = df.groupby(['Type', 'Participant']).rank(method='first', ascending=False)

# Perform the groupby and format the result.
result = df.groupby(['Type', 'Grouper'])['Rating'].mean().rename('MeanRating')
result = result.reset_index(level=1, drop=True).reset_index()

结果输出:

  Type  MeanRating
0    A         7.5
1    A         6.5
2    B         5.5
3    B         4.5

我使用method='first'的{​​{1}}参数来处理groupby.rank组内重复评级的情况。如果在您的数据集中不可能,则可以省略它,但如果您离开它并且没有重复,则不会更改输出。