本文转载自此文,感谢楼主的耐心分享
如下面这个DataFrame,按照Mt分组,取出Count最大的那行
1
2
3
4
|
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
|
方法1:在分组中过滤出Count最大的行(
这种效率非常低,不推荐使用
)
1
|
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,然后过滤出需要的行
(
比较繁琐
)
1
2
3
4
5
6
7
8
|
print df.groupby(['Mt'])['Count'].agg(max)
idx=df.groupby(['Mt'])['Count'].transform(max)
print idx
idx1 = idx == df['Count']
print idx1
df[idx1]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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)(
推荐
)
1
2
|
idx = df.groupby('Mt')['Count'].idxmax()
print idx
|
1
2
3
4
5
6
|
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
|
1
|
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
|
1
2
3
4
5
6
7
8
9
10
|
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)
|
1
2
3
4
5
|
Mt
s1 1
s2 4
s3 6
dtype: int64
|
|
Mt
|
Value
|
0
|
s1
|
1
|
3
|
s2
|
4
|
5
|
s3
|
6
|
方法4:先排好序,然后每组取第一个(
此方法效率非常高
)
1
|
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。
第一种:按照‘
分组
的名字’进
行
分组
, 然后求‘求的列名’列各组的平均值&
最大值
:
求平均值:
df.
group
by('
分组
的名字')['求的列名'].mean()
求
最大值
:
df.
group
by('
分组
的名字')['求的列名'].max()
第二种:是先
分组
, 然后求所有列
分组
后的平均值, 再取出‘求的列名’列的平均值&
最大值
:
求平均值:
df.
group
by('
分组
的名字').mean()['求的列名']
求
最大值
:
df.
group
by('
分组
的名字').max(..
dataframe
取
分组
中各组
最大值
对应
行
该问题源于电商后台项目的需求,找出每个商品的信息及其供货价最低的SKU对应的供货价、原价、现价,由于公司MySQL版本较低,无法使用开窗函数,故尝试将分页后的商品product与sku关联读出后通过
dataframe
做
分组
。
例子中包含姓、性别、科目、成绩,取每个人最高分记录
行
from
pandas
import
DataFrame
a=[...
使用pd读取,再使用np处理,np.min(数据,axis=)
其中min,max,median;最小,最大,中位数;aixs=0表示每列运算
import
pandas
as pd
import numpy as np
df=pd.read_csv('my_csv.csv',header=0,\
encoding='gbk',dtype={'年龄':float})
sele_at...
转载http://www.guoguoday.com/post/
pandas
获取
group
by
分组
里
最大值
所在的
行
/
pandas
获取
group
by
分组
里
最大值
所在的
行
10/May 2016python
pandas
pandas
获取
group
by
分组
里
最大值
所在的
行
如下面这个
DataFrame
,按照Mt
分组
,取出Count最大的那
行
import
pandas
as pd
df = pd.DataFr...
df = pd.
DataFrame
({'x':['A','C','B','D','C','B','B','A','D']
,'num':[12,23,43,54,52,1,8,9,12])
x num
0 A 12
1 C 23
2 B 43
3 D 54
4 C 52
5 B 1
6 B 8
7 A 9
8 D 12
取出df中按x
分组
后
最大值
所在
行
#第一步:找到
最大值
所在
行
的index,此时返回的是idm,series类型
idm = df.
group
by('x')['
我们处理某些表格数据时,会遇到某个字段在不同类别中有不同的值,有时候需要提取某个类别中该字段
最大值
所对应的
行
,只用
group
by 往往不
行
。其实,使用
group
by 和 merge 相结合,即可轻松解决这个问题。
定义一个
DataFrame
:
在上图的df中,不同的name对应着num值、年份,
现在想提取每一year的最大num所对应的name。
2、接下来,对df进
行
group
by,并...
下面为大家分享一篇
pandas
获取
group
by
分组
里
最大值
所在的
行
方法
,具有很好的参考价值,希望对大家有所帮助。一起过来看看吧
pandas
获取
group
by
分组
里
最大值
所在的
行
方法
如下面这个
DataFrame
,按照Mt
分组
,取出Count最大的那
行
import
pandas
as pddf = pd.
DataFrame
({'Sp':['a','b','c','d','e','f'], 'Mt':...
Series和
DataFrame
都是有索引的,索引的好处是快速定位,在涉及到两个Series或
DataFrame
时可以根据索引自动对齐,比如日期自动对齐,这样可以省去很多事。