如何按Total及分类内MIME类型Count对Pandas DataFrame排序?
自定义分组排序实现方案
需求背景
已有处理后的层级索引DataFrame bin_category_total_count_df,默认按category排序,现需调整为:
- 整体按各
category的Total计数降序排列 - 同一
category内,非Total的mime_type按Count降序排列 Total固定放在每个category的末尾
现有默认排序数据:
Count category mime_type 1 application/x-executable 19 application/x-pie-executable 395 application/x-sharedlib 1 Total 415 2 application/x-sharedlib 755 Total 755 3 application/x-sharedlib 1 Total 1 6 application/x-object 129 Total 129
目标排序结果:
Count category mime_type 2 application/x-sharedlib 755 Total 755 1 application/x-pie-executable 395 application/x-executable 19 application/x-sharedlib 1 Total 415 6 application/x-object 129 Total 129 3 application/x-sharedlib 1 Total 1
实现代码
核心通过Pandas的sort_values()函数,结合自定义辅助字段实现排序规则:
# 1. 提取每个category的Total值,生成映射关系 category_total = ( bin_category_total_count_df .xs('Total', level='mime_type') ['Count'] .rename('total_value') ) # 2. 重置层级索引为普通列,方便添加辅助字段 temp_df = bin_category_total_count_df.reset_index() # 3. 关联总计值并标记Total行 temp_df = temp_df.merge(category_total, on='category', how='left') temp_df['is_total'] = temp_df['mime_type'].apply(lambda x: 1 if x == 'Total' else 0) # 4. 按规则排序:总计值降序 → Total标记升序(Total排最后) → Count降序 temp_df = temp_df.sort_values( by=['total_value', 'is_total', 'Count'], ascending=[False, True, False] ) # 5. 恢复层级索引,得到最终结果 sorted_df = temp_df.set_index(['category', 'mime_type'])
代码说明
xs('Total', level='mime_type'):快速筛选所有mime_type为Total的行,提取每个分类的总计值is_total字段:用1标记Total行,排序时升序排列(0在前、1在后),确保Total固定在分类末尾- 排序优先级:先按分类总计值降序确定整体分组顺序,再按Total标记控制位置,最后按Count降序排列组内非Total项
内容的提问来源于stack exchange,提问作者Charlotte
相关产品推荐
相关产品推荐

