前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:pandas获取groupby分组里最大值所在的行

一日一技:pandas获取groupby分组里最大值所在的行

作者头像
用户8949263
发布2022-04-08 13:51:28
3.9K0
发布2022-04-08 13:51:28
举报

如下面这个DataFrame,按照Mt分组,取出Count最大的那行

代码语言:javascript
复制
import pandas as pd
 
df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'Count':[3,2,5,10,10,6]})

 

Count

Mt

Sp

Value

0

3

s1

a

1

1

2

s1

b

2

2

5

s2

c

3

3

10

s2

d

4

4

10

s2

e

5

5

6

s3

f

6

方法1:在分组中过滤出Count最大的行

代码语言:javascript
复制
df.groupby('Mt').apply(lambda t: t[t.Count==t.Count.max()])

Count

Mt

Sp

Value

Mt

s1

0

3

s1

a

1

s2

3

10

s2

d

4

4

10

s2

e

5

s3

5

6

s3

f

6

方法2:用transform获取原dataframe的index,然后过滤出需要的行

代码语言:javascript
复制
print df.groupby(['Mt'])['Count'].agg(max)
 


 
idx=df.groupby(['Mt'])['Count'].transform(max)
 
print idx
 
idx1 =  idx == df['Count']
 
print idx1
 


 
df[idx1]
 

代码语言:javascript
复制
Mt
 
s1     3
 
s2    10
 
s3     6
 
Name: Count, dtype: int64
 
0 3
 
1 3
 
2 10
 
3 10
 
4 10
 
5 6
 
dtype: int64
 
0     True
 
1    False
 
2    False
 
3     True
 
4     True
 
5     True
 
dtype: bool
 

Count

Mt

Sp

Value

0

3

s1

a

1

3

10

s2

d

4

4

10

s2

e

5

5

6

s3

f

6

上面的方法都有个问题是3、4行的值都是最大值,这样返回了多行,如果只要返回一行呢?

方法3:idmax(旧版本pandas是argmax)

代码语言:javascript
复制
idx = df.groupby('Mt')['Count'].idxmax()
 
print idx
 


 
df.iloc[idx]
 
代码语言:javascript
复制
Mt
 
s1    0
 
s2    3
 
s3    5
 
Name: Count, dtype: int64
 

Count

Mt

Sp

Value

0

3

s1

a

1

3

10

s2

d

4

5

6

s3

f

6

代码语言:javascript
复制
df.iloc[df.groupby(['Mt']).apply(lambda x: x['Count'].idxmax())]

Count

Mt

Sp

Value

0

3

s1

a

1

3

10

s2

d

4

5

6

s3

f

6

代码语言:javascript
复制
def using_apply(df):
 
return (df.groupby('Mt').apply(lambda subf: subf['Value'][subf['Count'].idxmax()]))
 


 
def using_idxmax_loc(df):
 
idx = df.groupby('Mt')['Count'].idxmax()
 
return df.loc[idx, ['Mt', 'Value']]
 


 
print using_apply(df)
 


 
using_idxmax_loc(df)
代码语言:javascript
复制
Mt
 
s1    1
 
s2    4
 
s3    6
 
dtype: int64
 

Mt

Value

0

s1

1

3

s2

4

5

s3

6

方法4:先排好序,然后每组取第一个

代码语言:javascript
复制
df.sort('Count', ascending=False).groupby('Mt', as_index=False).first()

Mt

Count

Sp

Value

0

s1

3

a

1

1

s2

10

d

4

2

s3

6

f

6

那问题又来了,如果不是要取出最大值所在的行,比如要中间值所在的那行呢?

思路还是类似,可能具体写法上要做一些修改,比如方法1和2要修改max算法,方法3要自己实现一个返回index的方法。不管怎样,groupby之后,每个分组都是一个dataframe。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-25,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 Python数据分析实例 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法1:在分组中过滤出Count最大的行
  • 方法2:用transform获取原dataframe的index,然后过滤出需要的行
  • 方法3:idmax(旧版本pandas是argmax)
  • 方法4:先排好序,然后每组取第一个
  • 那问题又来了,如果不是要取出最大值所在的行,比如要中间值所在的那行呢?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com