熊猫groupby对每个组值进行排序,并根据每个组的最大值对数据框组进行排序

时间:2020-01-02 08:21:51

标签: pandas pandas-groupby

我有一个包含3列的数据集,我试图将它们分组并按排序方式打印每个组(基于每个组中的最高值)。每个组中的记录也必须采用排序方式。

数据集如下所示。

key1,key2,val
b,y,21
c,y,25
c,z,10
b,x,20
b,z,5
c,x,17
a,x,15
a,y,18
a,z,100
df=pd.read_csv('/tmp/hello.csv')
df['max'] = df.groupby(['key1'])['val'].transform('max')
dff=df.sort_values(['max', 'val'], ascending=False).drop('max', axis=1)

我正在应用变换,因为它可以在每个组中工作,然后对值进行排序。

上面的代码产生了我想要的数据帧:

a,z,100
a,y,18
a,x,15

c,y,25
c,x,17
c,z,10

b,y,21
b,x,20
b,z,5

但是,下面的数据集使用相同的代码失败。

key1,key2,val
b,y,10
c,y,10
c,z,10
b,x,2
b,z,2
c,x,2
a,x,2
a,y,2
a,z,2

下面是所需的输出

key1,key2,val
c,y,10
c,z,10
c,x,2

b,y,10
b,x,2
b,z,2

a,x,2
a,y,2
a,z,2

请帮助我为我的场景正确地对数据框进行分组和排序。

1 个答案:

答案 0 :(得分:1)

将列key1添加到sort_values是因为第二个DataFrame中每个组有多个最大值10,因此排序不能区分组:

df['max'] = df.groupby(['key1'])['val'].transform('max')
dff=df.sort_values(['max','key1', 'val'], ascending=False).drop('max', axis=1)
print (dff)
  key1 key2  val
8    a    z  100
7    a    y   18
6    a    x   15
1    c    y   25
5    c    x   17
2    c    z   10
0    b    y   21
3    b    x   20
4    b    z    5

df['max'] = df.groupby(['key1'])['val'].transform('max')
dff=df.sort_values(['max','key1', 'val'], ascending=False).drop('max', axis=1)
print (dff)
  key1 key2  val
1    c    y   10
2    c    z   10
5    c    x    2
0    b    y   10
3    b    x    2
4    b    z    2
6    a    x    2
7    a    y    2
8    a    z    2