python - Pandas 在 groupby 之后获取所有行的最小值和最大值
问题描述
我有一个这样的数据框:
df = pd.DataFrame({'A' : list('ababababba'),
'B' : [1, 1, 1, 2, 2, 1,1,2,1,1],
'C' : [2.0, 5., 8., 1., 2., 9.,2.0,4.0,5.0,3.0],
'D' : [10,20,30,10,20,30,20,40,50,10]})
必需的:
A B C D
0 a 1 2.0 10 # a1 min keep
1 b 1 5.0 20 # b1 min
2 a 1 8.0 30 # a1 max keep
3 b 2 1.0 10
4 a 2 2.0 20
# b1 removed
# a1 remove
7 b 2 4.0 40
8 b 1 5.0 50 # b1 max keep
9 a 1 3.0 10 # a1 min keep
解决方案
你想要这个吗:
df.groupby(['A','B']).D.agg([min,max])
输出:
+---+---+-----+-----+
| | | min | max |
+---+---+-----+-----+
| A | B | | |
+---+---+-----+-----+
| a | 1 | 10 | 30 |
| | 2 | 20 | 20 |
| b | 1 | 20 | 50 |
| | 2 | 10 | 40 |
+---+---+-----+-----+
编辑:如果您希望所有行都具有最小值或最大值,请考虑transform
groups = df.groupby(['A','B']).D
min_val = groups.transform(min)
max_val = groups.transform(max)
df[(df.D==min_val) | (df.D==max_val)]
输出:
+---+---+---+-----+----+
| | A | B | C | D |
+---+---+---+-----+----+
| 0 | a | 1 | 2.0 | 10 |
| 1 | b | 1 | 5.0 | 20 |
| 2 | a | 1 | 8.0 | 30 |
| 3 | b | 2 | 1.0 | 10 |
| 4 | a | 2 | 2.0 | 20 |
| 7 | b | 2 | 4.0 | 40 |
| 8 | b | 1 | 5.0 | 50 |
+---+---+---+-----+----+
推荐阅读
- python-3.x - Python 脚本处理并生成 html 格式的结果。我希望它使用 WSGI 在网络上发布
- c# - EF Core IdentityUser 与业务模型存在多对多关系,如何使用 .Include().ThenInclude()?
- java - 如何从二维数组(java)中打印出奇数索引元素?
- python - Scrapy 仅返回字母列表中每个字母的第一项
- ios - UITextContentType 用户名正在使用电子邮件地址,但不是用户名
- java - 使用 select 和 option 标签在 jsp 中插入数据
- html - 如何在 Microsoft Edge 的 CSS 中将宽度设置为可用填充?
- c# - 压缩多个 csv 的 SSIS 脚本任务失败 - 当前上下文中不存在名称 zipfile
- javascript - 使用 javascript 保存 cookie 时出现 403 错误
- oracle - 在 oracle 中一次捕获多个异常