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

rga*_*ama 1 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
Run Code Online (Sandbox Code Playgroud)

我想得到这个:

Type   MeanRating
A        mean(6,9)
A        mean(5,8)
B        mean(4,7)
B        mean(3,6)
Run Code Online (Sandbox Code Playgroud)

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

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

roo*_*oot 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()
Run Code Online (Sandbox Code Playgroud)

结果输出:

  Type  MeanRating
0    A         7.5
1    A         6.5
2    B         5.5
3    B         4.5
Run Code Online (Sandbox Code Playgroud)

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