如何基于指定列的值对MultiIndex多层索引进行排序
多级索引DataFrame排序解决方案
要实现你需要的排序逻辑,分两步处理即可:先按level-0索引对应的Value总和降序确定其优先级,再在每个level-0组内按Value降序排列level-1索引。
实现代码
import pandas as pd # 构建初始DataFrame df = pd.DataFrame() df["Index1"] = ["A", "A", "B", "B", "C", "C"] df["Index2"] = ["X", "Y", "X", "Y", "X", "Y"] df["Value"] = [1, 4, 7, 3, 2, 7] df = df.set_index(["Index1", "Index2"]) # 计算每个level-0索引的Value总和,生成排序映射 group_sum = df.groupby(level=0)["Value"].sum().sort_values(ascending=False) # 添加临时排序键,完成两级排序后删除临时列 df_sorted = df.assign( level0_order=df.index.get_level_values(0).map(group_sum) ).sort_values(by=["level0_order", "Value"], ascending=[False, False]).drop(columns="level0_order") print(df_sorted)
输出结果
Value Index1 Index2 B X 7 Y 3 C Y 7 X 2 A Y 4 X 1
逻辑说明
- 用
groupby(level=0)统计每个Index1对应的Value总和,降序排序后得到level-0的优先级:B(总和10)> C(总和9)> A(总和5)。 - 通过
assign添加临时列level0_order,将每个Index1映射为对应的总和值,以此作为level-0的排序依据。 - 最后通过
sort_values先按level0_order降序确定level-0顺序,再按Value降序确定组内level-1顺序,最后移除临时列得到目标结果。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

