Pandas多索引DataFrame按季度分组对车型按销量降序排序方法
多层索引DataFrame按季度分组的销量降序排序实现
问题描述
我有一个以销售员(Salesperson)、年份(year)、季度(quarter)、**车型(Car model)**为多层索引(MultiIndex)的DataFrame,需要在每个季度分组内,按units sold(销量)降序排序,让销量最高的车型排在最前面。例如Tom在2022年Q1的最终排序需满足Benz居首、Audi居中、Ford末位。
示例数据代码
import pandas as pd import numpy as np # 构建多层索引 cars_sold = pd.MultiIndex.from_product([ ['Tom','Jerry'], ['2022', '2023'], ['Q1', 'Q2', 'Q3', 'Q4'], ['Ford', 'Audi', 'Benz']]) columns = ['units sold'] # 生成示例DataFrame df = pd.DataFrame( np.arange(48).reshape((len(cars_sold), len(columns))), index=cars_sold, columns=columns)
解决方案
通过groupby按前三层索引分组,再在组内按销量降序排序即可实现需求:
# 按销售员、年份、季度分组,组内按销量降序排序 sorted_df = df.groupby(level=[0, 1, 2], group_keys=False).apply( lambda x: x.sort_values('units sold', ascending=False) ) # 验证Tom 2022年Q1的排序结果 print(sorted_df.loc[('Tom', '2022', 'Q1')])
代码说明
groupby(level=[0,1,2]):指定按多层索引的前三个层级(销售员、年份、季度)分组,确保每个分组对应某销售员某年度某季度的所有车型数据。group_keys=False:避免在结果中生成额外的分组键索引,保持原多层索引结构。sort_values('units sold', ascending=False):对每个分组内的数据按销量列降序排序,让销量最高的车型排在组内首位。
验证结果
运行代码后,Tom 2022年Q1的输出结果如下,符合需求:
units sold Tom 2022 Q1 Benz 2 Audi 1 Ford 0
内容的提问来源于stack exchange,提问作者Novice Python charmer
相关产品推荐
相关产品推荐

