如何在 pandas 中对两个级别进行分组并按降序对值进行排序以选择每个组级别中的前 5 个

问题描述 投票:0回答:1

我有一个如下所示的数据框

实体名称 状态 商店#
姓名1 AL 1234
姓名2 TX 4545
姓名3 TX 6789
姓名2 CA 0123
姓名1 GA 7654
姓名1 GA 8888
姓名2 CA 9090
姓名2 CA 3456
姓名2 CA 7222

我希望它看起来像这样:

实体名称 状态 店铺数量
姓名2 CA 4
TX 1
姓名1 GA 2
AL 1
姓名3 TX 1

基本上,我已经能够在 Excel 的数据透视表中执行此操作,但由于某种原因我无法在 Pandas 中复制此操作,我确实需要帮助。我需要按商店计数降序排列实体名称(因此在上面的示例中,名称 2 将首先出现,因为名称 2 下总共有 5 家商店,其次是名称 1,总共有 3 家商店,最后是名称3,只有 1 家商店)。在实体名称分组中,我需要按州对商店进行计数,这也按降序排列,如上所示。最终,我想将其采用这种格式,以便我可以绘制这些数据如此处所示

我不知道为什么这在 Pandas 中如此困难,但我无法弄清楚。非常感谢任何帮助!蒂亚!

我已经尝试了 StackOverflow 中发布的许多解决方案,但我在按实体的商店总数进行第一级排序时一直失败。

我不断得到的结果看起来像这样:

实体名称 状态
姓名2 CA 4
姓名1 AL 1
GA 2
姓名3 TX 1
姓名2 TX 1
pandas dataframe sorting
1个回答
0
投票

一个选择是首先根据

Entity Name
对数据框进行排序:

sort_indices = (df
                .groupby('Entity Name')
                .State
                .transform('size')
                # sort in descending order,
                # largest value comes first
                .argsort()[::-1])
sorted_df = df.iloc[sort_indices]
sorted_df
  Entity Name State  Store#
8     Name 2    CA     7222
7     Name 2    CA     3456
6     Name 2    CA     9090
3     Name 2    CA      123
1     Name 2    TX     4545
5     Name 1    GA     8888
4     Name 1    GA     7654
0     Name 1    AL     1234
2     Name 3    TX     6789

下一步是根据

sorted_df
Entity Name
的组合对
State
进行分组,并计算大小。确保分组未排序,因此尊重原始形式:

(sorted_df
.groupby(['Entity Name', 'State'],sort=False,as_index=False)
.agg(count_of_stores=('State','size'))
)
  Entity Name State  count_of_stores
0     Name 2    CA                 4
1     Name 2    TX                 1
2     Name 1    GA                 2
3     Name 1    AL                 1
4     Name 3    TX                 1
© www.soinside.com 2019 - 2024. All rights reserved.