Pandas复杂分组排序实现:自定义A列顺序+B列按计数降序
解决方案
首先导入pandas并创建目标DataFrame:
import pandas as pd data = { 'A': ['foo', 'foo', 'bar', 'world', 'world', 'bar', 'foo'], 'B': ['text1', 'text2', 'text1', 'text3', 'text2', 'text3', 'text1'], 'C': [1, 2, 3, 4, 5, 6, 7] } df = pd.DataFrame(data)
步骤1:完成分组聚合统计
先按A、B分组统计C的计数,用groupby或你提到的pivot_table都可以:
# 方式1:用groupby直接统计 agg_df = df.groupby(['A', 'B'])['C'].count().reset_index(name='C') # 方式2:用pivot_table后转成普通DataFrame # agg_df = df.pivot_table(index=['A', 'B'], values='C', aggfunc='count').reset_index()
步骤2:指定A列的固定排序规则
将A列转为Categorical类型,手动设置排序优先级,确保排序时遵循world > bar > foo的顺序:
agg_df['A'] = pd.Categorical(agg_df['A'], categories=['world', 'bar', 'foo'], ordered=True)
步骤3:组内按C的计数降序排序
按A分组,在每个组内对C列降序排序,最后重置为多级索引还原目标格式:
result = agg_df.sort_values(by=['A', 'C'], ascending=[True, False]).set_index(['A', 'B'])
最终输出结果
运行后得到的result与预期一致:
C A B world text2 1 text3 1 bar text1 1 text3 1 foo text1 2 text2 1
完整整合代码
import pandas as pd data = { 'A': ['foo', 'foo', 'bar', 'world', 'world', 'bar', 'foo'], 'B': ['text1', 'text2', 'text1', 'text3', 'text2', 'text3', 'text1'], 'C': [1, 2, 3, 4, 5, 6, 7] } df = pd.DataFrame(data) agg_df = df.groupby(['A', 'B'])['C'].count().reset_index(name='C') agg_df['A'] = pd.Categorical(agg_df['A'], categories=['world', 'bar', 'foo'], ordered=True) result = agg_df.sort_values(by=['A', 'C'], ascending=[True, False]).set_index(['A', 'B']) print(result)
内容的提问来源于stack exchange,提问作者Nachtgold
相关产品推荐
相关产品推荐

