【问题标题】:How to groupby 2 columns but order descending by count()如何按 2 列分组,但按 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      
            

我该怎么做?

【问题讨论】:

    标签: python pandas sorting count pandas-groupby


    【解决方案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] 匹配
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 2022-10-12
    • 2017-03-21
    • 1970-01-01
    • 2011-05-10
    • 2020-10-25
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多