使用分类索引值对特定级别的多索引系列进行排序
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
【讨论】:
以上是关于使用分类索引值对特定级别的多索引系列进行排序的主要内容,如果未能解决你的问题,请参考以下文章