【问题标题】:pandas groupby sort descending orderpandas groupby 降序排序
【发布时间】:2015-01-17 01:49:40
【问题描述】:

pandas groupby 默认会排序。但我想更改排序顺序。我该怎么做?

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

【问题讨论】:

  • 您可以通过将返回的对象转换为数据框来对其进行排序。

标签: sorting pandas


【解决方案1】:

类似于上述答案之一,但尝试将.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?

【讨论】:

    【解决方案2】:

    这种操作包含在分层索引中。 Check out the examples here

    当你分组时,你正在制作新的索引。如果您还通过 .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-mean 列排序的 df。

    【讨论】:

      【解决方案3】:

      您可以在执行 groupby 之前对数据框执行 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
      

      【讨论】:

      • 如果你执行聚合然后想对聚合结果进行排序怎么办?
      【解决方案4】:

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

      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
      

      【讨论】:

        【解决方案5】:

        做你的 groupby,并使用 reset_index() 使它回到 DataFrame 中。然后排序。

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

        【讨论】:

          【解决方案6】:

          从 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 列现在按降序排序,而不是默认的升序。

          【讨论】:

          • 嗯,它似乎可以工作(Pandas 0.17.1),但由于它是一个未记录的功能,它不是很令人满意。 The documentation says groupby 保留 within 组中的键的顺序,但仅表示组本身的键已排序/未排序。我说的对吗?
          • 好点...两年内发生了很多变化,我会更新答案
          猜你喜欢
          • 1970-01-01
          • 2016-04-03
          • 2015-03-06
          • 2018-08-29
          • 2018-11-16
          • 2022-10-12
          • 2019-08-16
          • 2017-02-07
          • 1970-01-01
          相关资源
          最近更新 更多