You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:52:11