下面为大家分享一篇pandas获取groupby分组里最大值所在的行方法,具有很好的参考价值,希望对大家有所帮助。一起过来看看吧
pandas获取groupby分组里最大值所在的行方法
如下面这个dataframe,按照mt分组,取出count最大的那行
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]})
df
countmtspvalue
03 s1 a 1
12 s1 b 2
25 s2 c 3
310 s2 d 4
410 s2 e 5
56 s3 f 6
方法1:在分组中过滤出count最大的行
df.groupby('mt').apply(lambda t: t[t.count==t.count.max()])
countmtspvalue
mt
s103 s1 a 1
s2310 s2 d 4
410 s2 e 5
s356 s3 f 6
方法2:用transform获取原dataframe的index,然后过滤出需要的行
print df.groupby(['mt'])['count'].agg(max)
idx=df.groupby(['mt'])['count'].transform(max)
print idx
idx1 = idx == df['count']
print idx1
df[idx1]
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
countmtspvalue
03 s1 a 1
310 s2 d 4
410 s2 e 5
56 s3 f 6
上面的方法都有个问题是3、4行的值都是最大值,这样返回了多行,如果只要返回一行呢?
方法3:idmax(旧版本pandas是argmax)
idx = df.groupby('mt')['count'].idxmax()
print idx
df.iloc[idx]
mt
s1 0
s2 3
s3 5
name: count, dtype: int64
countmtspvalue
03 s1 a 1
310 s2 d 4
56 s3 f 6
df.iloc[df.groupby(['mt']).apply(lambda x: x['count'].idxmax())]
countmtspvalue
03 s1 a 1
310 s2 d 4
56 s3 f 6
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)
mt
s1 1
s2 4
s3 6
dtype: int64
mtvalue
0s1 1
3s2 4
5s3 6
方法4:先排好序,然后每组取第一个
df.sort('count', ascending=false).groupby('mt', as_index=false).first()
mtcountspvalue
0s1 3 a 1
1s2 10 d 4
2s3 6 f 6
那问题又来了,如果不是要取出最大值所在的行,比如要中间值所在的那行呢?
思路还是类似,可能具体写法上要做一些修改,比如方法1和2要修改max算法,方法3要自己实现一个返回index的方法。 不管怎样,groupby之后,每个分组都是一个dataframe。
相关推荐:
pandas+dataframe实现行列选择与切片操作
python 数据处理库 pandas 入门
以上就是pandas获取groupby分组里最大值所在的行方法的详细内容。