python - 如何在一个列上进行分组,同时在整个数据框中按另一列排序
问题描述
我有一个看起来像这样的数据框:
id total
1 50
1 0
1 0
2 100
2 0
2 0
3 75
3 0
3 0
但我需要它按总数降序排序,同时保持按id分组的行。像这样:
id total
2 100
2 0
2 0
3 75
3 0
3 0
1 50
1 0
1 0
我尝试了一些使用 groupby 的建议,如下所示:
grouped = df.groupby('id').apply(lambda g: g.sort_values('total', ascending=False))
看起来它正在做的是按升序对id进行分组和排序,然后对每个分组id中的总数进行子排序。但我需要它对总数中的所有行进行排序,同时保持按id分组的行
任何建议,将不胜感激。
解决方案
这是一种使用.groupby()
,.list()
和.explode()
>>> df
id total
0 1 50
1 1 0
2 1 0
3 2 100
4 2 0
5 2 0
6 3 75
7 3 0
8 3 0
>>> df.sort_values('total', ascending=False).groupby('id', sort=False).agg(list).explode('total').reset_index()
id total
0 2 100
1 2 0
2 2 0
3 3 75
4 3 0
5 3 0
6 1 50
7 1 0
8 1 0
这个想法首先按total
降序对列进行排序。然后,按id
列对其进行分组,而不对分组索引进行排序。接下来,将list()
函数.agg()
作为参数传递给。最后,.explode()
在total
列上使用。
推荐阅读
- javascript - axios 自动将 base url 添加到 json 响应中的 urls 问题
- laravel - 如果用户在 URL Laravel 中键入 POST 路由,中间件会重定向用户
- node.js - DocumentClient 和 GSI 的 batchWrite 方法
- javascript - 当我在 Vue 中单击路由页面 About 时,数据正在清除
- python - 将函数列表应用于可迭代列表
- ollydbg - 另存为小端
- ios - 搜索结果后,Swift UITableView 单元格选择不起作用
- php - 使用 STDIN 复制大容量插入
- selenium-webdriver - 在 selenium 中使用 xpath 或 css 获取其 n 个子元素具有相同类的父元素
- mysql - Mysql更新和连接查询