python - 选择 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:转换无法产生聚合结果
我的预期结果是一个名为Top2Mean
next 8
toJohn
和7
next to的新列Jim
。
提前致谢!
解决方案
让我们计算mean
,level=0
然后map
将计算的平均值发送到Name
列以广播聚合结果。
top2 = df.groupby('Name')['Value'].nlargest(2).mean(level=0)
df['Top2Mean'] = df['Name'].map(top2)
例如,如果我们需要group
在多个列上,Name
那么City
我们必须使用计算的平均值mean
level=[Name, City]
map
MultiIndex.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
推荐阅读
- javascript - 使用ionic 5将数据从firebase存储到firebase离线存储中
- flutter - Flutter通过rest api端点上传文件
- amazon-web-services - DynamoDB Nodejs ConditionalExpresion attribute_exists - 验证错误
- docker - 如何在 docker 中运行 opengrok?
- macos - 从 GKNoise 使用 gradientColors 创建 SKTexture 时,颜色“对 NSColor Generic Gray Gamma 无效”
- amazon-web-services - 如何在 Amazon Lightsail 实例上启用 Amazon Inspector
- mutt - 基于当前主机名的 Mutt 配置
- c# - C# XDocument 如何使用 linq 过滤元素
- swift - SwiftUI 视图在移动时会被重新渲染,导致卡顿
- sql - 为什么不能将csv复制到SQL?