Sorting 按降序排序

Sorting 按降序排序,sorting,pandas,Sorting,Pandas,默认情况下,pandas groupby将进行排序。但是我想更改分拣顺序。我该怎么做 我猜我无法对返回的groupby对象应用排序方法。从0.18开始,一种方法是使用分组数据的排序索引方法 下面是一个例子: np.random.seed(1) n=10 df = pd.DataFrame({'mygroups' : np.random.choice(['dogs','cats','cows','chickens'], size=n), 'data' : n

默认情况下,pandas groupby将进行排序。但是我想更改分拣顺序。我该怎么做


我猜我无法对返回的groupby对象应用排序方法。

从0.18开始,一种方法是使用分组数据的
排序索引方法

下面是一个例子:

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

如您所见,groupby列现在按降序排序,而不是按默认值升序排序

进行分组,并使用reset_index()将其返回到数据帧中。然后分类

grouped = df.groupby('mygroups').sum().reset_index()
grouped.sort_values('mygroups', ascending=False)

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

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

在执行groupby之前,可以对数据帧执行
排序\u values()
。熊猫保留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

这种操作包含在层次索引中

当你分组时,你正在制作新的索引。如果还通过.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'))

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

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

df.groupby('group')['id'].count().sort_values(ascending=False)
ascending=False
将从高到低排序,默认为从低到高排序

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


您可以通过将返回的对象转换为数据帧来对其进行排序。这似乎是可行的(Pandas 0.17.1),但由于它是一个未记录的功能,因此并不十分令人满意。
groupby
保留组中键的顺序,但只表示组中键本身已排序/未排序。我说的对吗?很好。。。在2年内,批次发生了变化,我将更新答案。如果执行聚合,然后根据聚合结果排序,会怎么样?