Pandas分组后获取最大值和最小值的所有行

4
我有一个这样的数据框:
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

相关链接: 如何在pandas groupby中获取最小值和最大值行

如何在pandas groupby中从两个系列中获取最大值和最小值

如何在pandas groupby中获取最大日期和最小日期

如何在pandas groupby中按列的值选择一行(例如,最小值、最大值等)

1个回答

4

你想要这个吗:

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 |
+---+---+---+-----+----+

我想要所有最小值和最大值以及C的行。 - BhishanPoudel
没错,它可以处理大量的代码,非常棒。顺便问一下,你怎么把输出变成漂亮的表格形式?那看起来真的很美,我的Jupyter笔记本只是简单地给出了一个表格。 - BhishanPoudel
@astro123 我使用这个网站来格式化表格。 - Quang Hoang
谢谢,我在想你是否有类似于Python模块、Jupyter设置或Alfred工作流程之类的东西。 - BhishanPoudel
1
NVM,我知道了。 from tabulate import tabulate print(tabulate(df, headers=df.columns, tablefmt='psql')) - BhishanPoudel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接