pandas groupby降序排序

093gszye  于 2023-04-04  发布在  其他
关注(0)|答案(8)|浏览(256)

pandas groupby默认排序。但是我想改变排序顺序。我该怎么做?
我猜我不能对返回的groupby对象应用sort方法。

ecbunoof

ecbunoof1#

执行groupby操作,然后使用reset_index()将其返回到DataFrame中,然后进行排序。

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

mwecs4sa2#

从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

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

xlpyo6sf

xlpyo6sf3#

类似于上面的答案之一,但尝试将.sort_values()添加到.groupby()将允许您更改排序顺序。如果您需要对单个列进行排序,它看起来像这样:

df.groupby('group')['id'].count().sort_values(ascending=False)

ascending=False将从高到低排序,默认为从低到高排序。

  • 注意其中的一些聚合。例如.size()和.count()返回不同的值,因为.size()计数NaN。

What is the difference between size and count in pandas?

efzxgjgh

efzxgjgh4#

保持顺序或按降序排序的其他示例:

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
bqujaahr

bqujaahr5#

你可以在执行groupby之前在dataframe上执行sort_values()。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
puruo6ea

puruo6ea6#

这种操作在分层索引中有介绍。Check out the examples here
当你groupby的时候,你正在创建新的索引。如果你也通过.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。

kuhbmx9i

kuhbmx9i7#

在'sort_values'子句中使用'by'参数一般示例-'Customer Name'和'Profit'是列

df.groupby('Customer Name').Profit.agg(['count', 'min', 'max', 
            'mean']).sort_values(by = ['count'], ascending=False)
4dc9hkyq

4dc9hkyq8#

根据您的需求,最简单的解决方案可能是:

list_of_groups = list(df.groupby('group_name'))[::-1]

相关问题