使用分类索引值对特定级别的多索引系列进行排序

Posted

技术标签:

【中文标题】使用分类索引值对特定级别的多索引系列进行排序【英文标题】:Sort a multi-index Series on a particular level using Categorical Index values 【发布时间】:2021-02-13 04:36:08 【问题描述】:

我正在使用 Pandas groupby 来获取每年的每月前 n 项。

month_gr = df.groupby(by=[df.index.year, df.index.month_name(), df['Item Name']])
month_gr['Total'].sum().groupby(level=[0,1], group_keys=False).nlargest(5).sort_index(level=1)

这给了我输出:

Order Datee  Order Datee  Item Name           
2020         August       12oz w/ lids            10097.50
                          8oz cup / lids          10246.50
                          Full fat Milk           32507.00
                          Grilled Chic WRAP       94166.58
                          Special Blend Beans     81855.00
             July         8oz cup / lids           4801.50
                          Arwa500ml                6700.41
                          Full fat Milk           13430.00
                          Spanish Latte ( R )      6480.00
                          Special Blend 500g      29880.00
             June         Full fat Milk            4740.00
                          MANAEESH CHEESE          3576.24
                          Marble cake              4810.65
                          NUTELLA CHEESECAKE       3350.90
                          Special Blend Beans      5652.00
             September    CLUB SANDWICH            1040.10
                          Cappuccino (Regular)     1404.80
                          Flat White (Regular)     1162.40
                          Ginger shot big          2016.00
                          Spanish Latte ( R )       926.40
Name: Total, dtype: float64

如果我使用 sort_index(level=1),它会使用字母顺序对值进行排序,从而得到相同的输出。 但是,我想按每月订单对其进行排序,如下所示:

cats = ['January', 'February', 'March', 'April','May','June', 'July', 'August','September', 'October', 'November', 'December']

我找到了一种解决方案,它使用 pd.CategoricalIndex 根据月份对单个索引系列进行排序,但我不知道如何将它用于多索引。

如果您能解释我如何根据月份(1 级)对上述数据进行排序,或者更具体地按年和月份(0 级和 1 级)对上述数据进行排序。

【问题讨论】:

【参考方案1】:

一个短DataFrame的例子。

df = pd.DataFrame(
        'year': [2020, 2020, 2020, 2020, 2020, 2020],
        'month_name': ['August', 'August', 'August', 'July', 'July', 'September'],
        'Item Name': ['a', 'b', 'c', 'd', 'e', 'f'],
        'Total': [1, 2, 3, 4, 5, 6]
    )

month_gr = df.groupby(by=['year', 'month_name', 'Item Name'])['Total'].sum()
print(month_gr)

打印:

year  month_name  Item Name
2020  August      a            1
                  b            2
                  c            3
      July        d            4
                  e            5
      September   f            6
Name: Total, dtype: int64

然后你可以重置索引、设置分类列、排序值和设置索引:

month_gr = month_gr.reset_index()

cats = ['January', 'February', 'March', 'April','May','June', 'July', 'August','September', 'October', 'November', 'December']
month_gr['month_name'] = pd.Categorical(month_gr['month_name'], cats, ordered=True)

print(month_gr.sort_values(by=['year', 'month_name']).set_index(['year', 'month_name', 'Item Name']))

打印:

                           Total
year month_name Item Name       
2020 July       d              4
                e              5
     August     a              1
                b              2
                c              3
     September  f              6

【讨论】:

以上是关于使用分类索引值对特定级别的多索引系列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在尊重其索引结构的同时对多索引进行排序

在遵循特定结构的同时按列对多索引进行排序

根据级别 0 索引对多索引 Pandas DataFrame 的级别 1 索引进行自定义排序

在保持二级索引完整的同时对多索引数据框中的行进行排序

如何使用 Pandas 将多索引系列加入单个索引数据框?

CTreeCtrl - 获取项目位置