pandas groupby按降序排序

nbe*_*ker 19 sorting pandas

pandas groupby默认排序.但我想改变排序顺序.我怎样才能做到这一点?

我猜我不能将sort方法应用于返回的groupby对象.

sze*_*lin 27

做你的groupby,并使用reset_index()将其重新导入DataFrame.然后排序.

grouped = df.groupby('mygroups').sum().reset_index()
grouped.sort_values('mygroups', ascending=False)
Run Code Online (Sandbox Code Playgroud)


小智 15

类似于上面的答案之一,但尝试添加.sort_values()到您的.groupby()将允许您更改排序顺序。如果您需要对单列进行排序,则如下所示:

df.groupby('group')['id'].count().sort_values(ascending=False)
Run Code Online (Sandbox Code Playgroud)

ascending=False 会从高到低排序,默认是从低到高排序。

*小心这些聚合中的一些。例如 .size() 和 .count() 返回不同的值,因为 .size() 计算 NaN。

熊猫的大小和数量有什么区别?


JD *_*ong 12

从Pandas 0.18开始,一种方法是使用sort_index分组数据的方法.

这是一个例子:

np.random.seed(1)
n=10
df = pd.DataFrame({'mygroups' : np.random.choice(['dogs','cats','cows','chickens'], size=n), 
                   'data' : np.random.randint(1000, size=n)})

grouped = df.groupby('mygroups', sort=False).sum()
grouped.sort_index(ascending=False)
print grouped

data
mygroups      
dogs      1831
chickens  1446
cats       933
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,groupby列现在按降序排序,而不是默认的升序.


The*_*Cat 6

您可以sort_values()在执行 groupby 之前对数据框执行 a 。Pandas 保留了 groupby 中的顺序。

In [44]: d.head(10)
Out[44]:
              name transcript  exon
0  ENST00000456328          2     1
1  ENST00000450305          2     1
2  ENST00000450305          2     2
3  ENST00000450305          2     3
4  ENST00000456328          2     2
5  ENST00000450305          2     4
6  ENST00000450305          2     5
7  ENST00000456328          2     3
8  ENST00000450305          2     6
9  ENST00000488147          1    11

for _, a in d.head(10).sort_values(["transcript", "exon"]).groupby(["name", "transcript"]): print(a)
              name transcript  exon
1  ENST00000450305          2     1
2  ENST00000450305          2     2
3  ENST00000450305          2     3
5  ENST00000450305          2     4
6  ENST00000450305          2     5
8  ENST00000450305          2     6
              name transcript  exon
0  ENST00000456328          2     1
4  ENST00000456328          2     2
7  ENST00000456328          2     3
              name transcript  exon
9  ENST00000488147          1    11
Run Code Online (Sandbox Code Playgroud)

  • 如果您执行聚合然后想对聚合结果进行排序怎么办? (3认同)

小智 6

分层索引涵盖了此类操作。查看此处的示例

当你进行分组时,你正在创建新的索引。如果你还通过.agg()传递一个列表。你会得到多列。我试图弄清楚这一点并通过谷歌找到了这个线程。

事实证明,如果您传递一个与您想要排序的确切列相对应的元组。

尝试这个:

# generate toy data 
ex = pd.DataFrame(np.random.randint(1,10,size=(100,3)), columns=['features', 'AUC', 'recall'])

# pass a tuple corresponding to which specific col you want sorted. In this case, 'mean' or 'AUC' alone are not unique. 
ex.groupby('features').agg(['mean','std']).sort_values(('AUC', 'mean'))
Run Code Online (Sandbox Code Playgroud)

这将输出仅按 AUC 均值列排序的 df。


Sur*_*rya 5

保留顺序或按降序排序的其他实例:

In [97]: import pandas as pd                                                                                                    

In [98]: df = pd.DataFrame({'name':['A','B','C','A','B','C','A','B','C'],'Year':[2003,2002,2001,2003,2002,2001,2003,2002,2001]})

#### Default groupby operation:
In [99]: for each in df.groupby(["Year"]): print each                                                                           
(2001,    Year name
2  2001    C
5  2001    C
8  2001    C)
(2002,    Year name
1  2002    B
4  2002    B
7  2002    B)
(2003,    Year name
0  2003    A
3  2003    A
6  2003    A)

### order preserved:
In [100]: for each in df.groupby(["Year"], sort=False): print each                                                               
(2003,    Year name
0  2003    A
3  2003    A
6  2003    A)
(2002,    Year name
1  2002    B
4  2002    B
7  2002    B)
(2001,    Year name
2  2001    C
5  2001    C
8  2001    C)

In [106]: df.groupby(["Year"], sort=False).apply(lambda x: x.sort_values(["Year"]))                        
Out[106]: 
        Year name
Year             
2003 0  2003    A
     3  2003    A
     6  2003    A
2002 1  2002    B
     4  2002    B
     7  2002    B
2001 2  2001    C
     5  2001    C
     8  2001    C

In [107]: df.groupby(["Year"], sort=False).apply(lambda x: x.sort_values(["Year"])).reset_index(drop=True)
Out[107]: 
   Year name
0  2003    A
1  2003    A
2  2003    A
3  2002    B
4  2002    B
5  2002    B
6  2001    C
7  2001    C
8  2001    C
Run Code Online (Sandbox Code Playgroud)