赞
踩
转载http://www.guoguoday.com/post/pandas获取groupby分组里最大值所在的行/
- 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 | |
---|---|---|---|---|
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 |
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 |
- 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
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行的值都是最大值,这样返回了多行,如果只要返回一行呢?
- 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 | |
---|---|---|---|---|
0 | 3 | s1 | a | 1 |
3 | 10 | s2 | d | 4 |
5 | 6 | s3 | f | 6 |
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 |
- 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 | |
---|---|---|
0 | s1 | 1 |
3 | s2 | 4 |
5 | s3 | 6 |
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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。