如何按 2 列分组,但按 count() 降序排列

Posted

技术标签:

【中文标题】如何按 2 列分组,但按 count() 降序排列【英文标题】:How to groupby 2 columns but order descending by count() 【发布时间】:2021-05-05 13:30:56 【问题描述】:

我有一个数据框,想将 2 列分组,这工作正常。

df.groupby(["Sektor, CustomerID"]).count().head(10)
            _Order_ID_  Order_timezone  Order_weight                                
AE  1298772       1         1                1  
    1298788       1         1                1  
    1298840       2         2                2  
    1298912       1         1                1

AT  1038570       1         1                1  
    1040424       1         1                1  
    1040425       3         3                3  
    1040426       2         2                2  
    1040427       1         1                1  
    1040428       1         1                1  
    1040429       2         2                2  
            

现在分组数据框按 CustomerID 值排序。但我想按count()对其进行排序。所以我有 Sektor,然后是 CustomerID,但出现最多的 CustomerIds 应该在顶部。所以下降。

预期输出应该是:

            _Order_ID_  Order_timezone  Order_weight                                
AE  1298840       2         2                2
    1298772       1         1                1  
    1298788       1         1                1      
    1298912       1         1                1

AT  1040425       3         3                3
    1040426       2         2                2
    1040429       2         2                2
    1038570       1         1                1  
    1040424       1         1                1          
    1040427       1         1                1  
    1040428       1         1                1      
            

我该怎么做?

【问题讨论】:

【参考方案1】:

用途:

df1 = df.groupby(["Sektor", "CustomerID"]).count()

如果需要输出 10 行:

df1 = df1.sort_values(['Sektor','_Order_ID_'], ascending=[True, False]).head(10)
print (df1)
                   _Order_ID_  Order_timezone  Order_weight
Sektor CustomerID                                          
AE     1298840              2               2             2
       1298772              1               1             1
       1298788              1               1             1
       1298912              1               1             1
AT     1040425              3               3             3
       1040426              2               2             2
       1040429              2               2             2
       1038570              1               1             1
       1040424              1               1             1
       1040427              1               1             1

如果每个组需要 10 行(如果存在)Sektor

df1 = df1.sort_values(['Sektor','_Order_ID_'], ascending=[True, False]).groupby('Sektor').head(10)
print (df1)
                   _Order_ID_  Order_timezone  Order_weight
Sektor CustomerID                                          
AE     1298840              2               2             2
       1298772              1               1             1
       1298788              1               1             1
       1298912              1               1             1
AT     1040425              3               3             3
       1040426              2               2             2
       1040429              2               2             2
       1038570              1               1             1
       1040424              1               1             1
       1040427              1               1             1
       1040428              1               1             1

【讨论】:

它说缺少参数“by”。因此,如果我使用其他参数之一,则不再组合 Sektor。所以例如我有来自 Sektor A 中一个客户 ID 的 29 个订单,但来自 Sektor A 中一个客户 ID 的 20 个订单,现在不再在分组 Sektor A 中,而是在单独的 Sektor A 下几行。 @Russgo - 你能发布一些数据样本吗?因为如果使用df.groupby(["Sektor, CustomerID"]),则意味着按两列的组合进行分组。 @Russgo - 或者需要第二部分我的答案? 我编辑了我的帖子。分组后的 DataFrame 如下所示。当我使用你的两个想法时,分组就被解散了。 @Russgo - 表示按Sektor 上级(真)和_Order_ID_ 下级(假)排序。列列表['Sektor','_Order_ID_'] 与排序列表[True, False] 匹配

以上是关于如何按 2 列分组,但按 count() 降序排列的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 按降序排列?

Excel—分组然后取每组中对应时间列值最大的或者最小的

#yyds干货盘点#登天之梯——Pandas快速入门(下)

访问报告:如何按一个字段分组,但按另一个字段排序?

添加分区以及分析函数和窗口函数

:MySQL开窗函数