pandas获取groupby分组⾥最⼤值所在的⾏,获取第⼀个等操作10/May 2016
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
Count Mt Sp Value
03s1a1
12s1b2
25s2c3
310s2d4
410s2e5
56s3f6
⽅法1:在分组中过滤出Count最⼤的⾏
Count Mt Sp Value
Mt
s103s1a1
groupby分组
s2310s2d4
410s2e5
s356s3f6
⽅法2:⽤transform获取原dataframe的index,然后过滤出需要的⾏
upby(['Mt'])['Count'].agg(max)
upby(['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
Count Mt Sp Value
03s1a1
310s2d4
Count Mt Sp Value
410s2e5
56s3f6
上⾯的⽅法都有个问题是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
Count Mt Sp Value
03s1a1
310s2d4
56s3f6
df.upby(['Mt']).apply(lambda x: x['Count'].idxmax())]
Count Mt Sp Value
03s1a1
310s2d4
56s3f6
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
Mt Value
0s11
3s24
5s36
⽅法4:先排好序,然后每组取第⼀个
df.sort('Count', ascending=False).groupby('Mt', as_index=False).first()
Mt Count Sp Value
0s13a1
1s210d4
2s36f6
那问题⼜来了,如果不是要取出最⼤值所在的⾏,⽐如要中间值所在的那⾏呢?
思路还是类似,可能具体写法上要做⼀些修改,⽐如⽅法1和2要修改max算法,⽅法3要⾃⼰实现⼀个返回index的⽅法。不管怎样,groupby之后,每个分组都是⼀个dataframe。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。