首页 > 解决方案 > 选择 pandas groupby 中的前 n 个项目并计算平均值

问题描述

我有以下数据框:

df = pd.DataFrame({'Value': [0, 1, 2,3, 4,5,6,7,8,9],'Name': ['John', 'Jim', 'John','Jim', 'John','Jim','Jim','John','Jim','John']})
df
    Value   Name
0   0   John
1   1   Jim
2   2   John
3   3   Jim
4   4   John
5   5   Jim
6   6   Jim
7   7   John
8   8   Jim
9   9   John

我想选择最重要的n项目并从列中Name找到平均值。Value

我试过这个:

df['Top2Mean'] = df.groupby(['Name'])['Value'].nlargest(2).transform('mean')

但是出现以下错误:

ValueError:转换无法产生聚合结果

我的预期结果是一个名为Top2Meannext 8toJohn7next to的新列Jim

提前致谢!

标签: pythonpandasdataframe

解决方案


让我们计算meanlevel=0然后map将计算的平均值发送到Name列以广播聚合结果。

top2 = df.groupby('Name')['Value'].nlargest(2).mean(level=0)
df['Top2Mean'] = df['Name'].map(top2)

例如,如果我们需要group在多个列上,Name那么City我们必须使用计算的平均值meanlevel=[Name, City]mapMultiIndex.map

c = ['Name', 'City']
top2 = df.groupby(c)['Value'].nlargest(2).mean(level=c)
df['Top2Mean'] = df.set_index(c).index.map(top2)

使用自定义 lambda 函数的groupby替代方法transform

df['Top2Mean'] = df.groupby('Name')['Value']\
                   .transform(lambda v: v.nlargest(2).mean())

   Value  Name  Top2Mean
0      0  John         8
1      1   Jim         7
2      2  John         8
3      3   Jim         7
4      4  John         8
5      5   Jim         7
6      6   Jim         7
7      7  John         8
8      8   Jim         7
9      9  John         8

推荐阅读