python - Pandas - 前 n 个最大值 groupby 熊猫数据框
问题描述
我有一个熊猫数据框,如下所示:
df = pd.DataFrame({
'a': [1, 1, 1, 1, 1, 2, 2, 2, 2],
'b': [3, 2, 1, 4, 2, 1, 2, 2, 1]
})
这给了我
>>> df
a b
0 1 3
1 1 2
2 1 1
3 1 4
4 1 2
5 2 1
6 2 2
7 2 2
8 2 1
我想按列对数据框进行分组a
,并从每组的列中返回前 N 个最大值,按该最大值降序排列。b
我做了什么?
让我们考虑一下我只想要前两个最大值,我已经完成了以下操作:
- 按两列降序对数据框进行排序
- 获取前两个值
- 由于这些值是升序的,所以再按降序排序
df = df.sort_values(['a', 'b'], ascending=False)
df = df.groupby('a').nth([0,1])
df = df.sort_values(['a', 'b'], ascending=False).reset_index()
这给了我
>>> df
a b
0 2 2
1 2 2
2 1 4
3 1 3
输出 Works fine,但这不是执行此操作的有效方法。
我也尝试过nlargest
函数,但它没有帮助,因为它会删除其他列并仅返回该b
列。
df = df.groupby('a')['b'].nlargest(2)
这给了我
>>> df
0 2
1 2
2 4
3 3
Name: b, dtype: int64
做这个的最好方式是什么?
解决方案
Sort
按列的值,b
然后group
是数据框和聚合,head(n)
用于选择n
每个组的第一行
df.sort_values('b', ascending=False).groupby('a').head(2)
a b
3 1 4
0 1 3
6 2 2
7 2 2
推荐阅读
- python - 将单词的部分拼接成一个新单词
- php - 在 Symfony 中使用 API Mercure 时出现问题
- android - 从 Firebase android 中的子值获取推送的 ID
- reactjs - React Js 状态不更新
- katalon-studio - 当我们在 groovy 类中定义 webdriver 工厂时遇到错误消息
- asp.net-mvc - asp.net core EF 从另一个表中获取数据
- java - 在 android CallLogCalls 中使用 PHONE_ACCOUNT_ID 识别 sim 插槽
- c - 两个little endian机器需要转换
- python - “为 lru-dict 构建轮子”和“为 lru-dict 运行 setup.py install”错误
- python - 驱动程序自动代码指向起始 URL