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

如何在Pandas中实现双层分组排序并生成类Excel透视表结果?

Pandas实现带层级排序的类透视表结果

核心思路

先计算两层统计量(实体总门店数、实体-州门店数),基于总门店数完成第一层排序,再在实体组内按州门店数排序,最后处理重复实体名的显示。

完整代码示例

import pandas as pd

# 构造示例数据
data = {
    'Entity Name': ['A集团', 'A集团', 'A集团', 'B集团', 'B集团', 'C集团', 'A集团', 'B集团', 'C集团'],
    'State': ['加州', '德州', '加州', '纽约州', '加州', '德州', '德州', '纽约州', '加州'],
    'Store#': ['S001', 'S002', 'S003', 'S004', 'S005', 'S006', 'S007', 'S008', 'S009']
}
df = pd.DataFrame(data)

# 1. 计算实体总门店数
entity_total = df.groupby('Entity Name')['Store#'].nunique().reset_index(name='Entity_Total_Count')

# 2. 计算实体-州的门店数
state_group = df.groupby(['Entity Name', 'State'])['Store#'].nunique().reset_index(name='State_Store_Count')

# 3. 合并统计量并排序
merged_df = pd.merge(state_group, entity_total, on='Entity Name')
# 先按实体总门店数降序,再按州门店数降序
sorted_df = merged_df.sort_values(by=['Entity_Total_Count', 'State_Store_Count'], ascending=[False, False])

# 4. 处理重复实体名的显示:仅保留每组第一个实体名,其余为空
sorted_df['Entity Name'] = sorted_df['Entity Name'].mask(sorted_df['Entity Name'].duplicated(), '')

# 5. 整理输出列(可选:移除总计数列,按需保留)
final_df = sorted_df[['Entity Name', 'State', 'State_Store_Count']].rename(columns={'State_Store_Count': '门店数量'})

print(final_df)

输出效果

Entity Name State  门店数量
0         A集团    德州      2
1                 加州      2
2         B集团  纽约州      2
3                 加州      1
4         C集团    加州      1
5                 德州      1

关键说明

  • 用nunique()统计门店数(避免同一门店重复计数),如果你的Store#无重复,也可以用count()替代
  • 排序时必须基于实体总门店数,而不是直接对分组后的结果排序,这是解决排序不符合预期的核心
  • 用mask()+duplicated()快速处理重复实体名的空值显示,比循环高效

内容的提问来源于stack exchange,提问作者moto_prns2720

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:52:12