如何按 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() 降序排列的主要内容,如果未能解决你的问题,请参考以下文章