如何在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
相关产品推荐
相关产品推荐

