如何按层级关联规则对Pandas DataFrame进行排序?
解决方法
要实现你需要的层级联动排序,核心是给每行生成对应的完整层级路径,再按路径排序即可。具体步骤如下:
- 为每行生成
path列,路径规则为:父级路径 + "/" + 当前Level(顶层Saga的路径就是自身Level) - 按
path列排序后,就能得到父级紧跟子级的树形排序效果
完整代码示例
import pandas as pd # 你的原始DataFrame data = { 'Level': ['A1', 'B4', 'C', 'C', 'B3', 'C', 'C', 'C', 'C', 'A2', 'B1', 'C', 'C', 'C', 'B2', 'C', 'C', 'C'], 'Parent': [None, 'A2', 'B1', 'B1', 'A2', 'B2', 'B2', 'B1', 'B2', None, 'A1', 'B2', 'B2', 'B3', 'A1', 'B4', 'B4', 'B4'], 'Type': ['Saga', 'Epic', 'Story', 'Story', 'Epic', 'Story', 'Story', 'Story', 'Story', 'Saga', 'Epic', 'Story', 'Story', 'Story', 'Epic', 'Story', 'Story', 'Story'] } df = pd.DataFrame(data) # 构建Level到路径的映射字典 level_path_map = {} # 先处理顶层Saga(Parent为None) saga_rows = df[df['Parent'].isna()] for _, row in saga_rows.iterrows(): level_path_map[row['Level']] = row['Level'] # 处理中间层Epic,路径为父级Saga的路径 + 当前Level epic_rows = df[df['Type'] == 'Epic'] for _, row in epic_rows.iterrows(): parent_path = level_path_map[row['Parent']] level_path_map[row['Level']] = f"{parent_path}/{row['Level']}" # 处理底层Story,路径为父级Epic的路径 + 当前Level df['path'] = df.apply( lambda x: f"{level_path_map[x['Parent']]}/{x['Level']}" if x['Type'] == 'Story' else level_path_map.get(x['Level'], ''), axis=1 ) # 按路径排序,然后删除临时的path列 sorted_df = df.sort_values('path').drop('path', axis=1) print(sorted_df)
排序后结果
Level Parent Type 0 A1 None Saga 10 B1 A1 Epic 2 C B1 Story 3 C B1 Story 7 C B1 Story 14 B2 A1 Epic 5 C B2 Story 6 C B2 Story 8 C B2 Story 11 C B2 Story 12 C B2 Story 9 A2 None Saga 4 B3 A2 Epic 13 C B3 Story 1 B4 A2 Epic 15 C B4 Story 16 C B4 Story 17 C B4 Story
这个结果完全符合你的要求:
- 顶层Saga(A1、A2)优先排序
- 每个Saga后紧跟其下属的Epic(B1、B2属于A1;B3、B4属于A2)
- 每个Epic后直接紧跟其下属的所有Story(C行)
内容的提问来源于stack exchange,提问作者dgho
相关产品推荐
相关产品推荐

