如何基于分类层级字典生成含完整层级的Pandas DataFrame?
分类层级转Pandas DataFrame实现方案
需求说明
给定定义分类父子层级的字典:
hierarchy = { 'Category1': [], 'Category2': ['Category1'], 'Category3': ['Category1'], 'Category4': ['Category2'], 'Category5': ['Category4'], 'Category6': ['Category4'], 'Category7': ['Category6']}
需编写函数将层级信息转换为Pandas DataFrame,每行对应一个叶子分类的完整层级,列按从大到小的分类级别命名,期望输出如下:
import pandas as pd pd.DataFrame(data={ 'Biggest_category' : ['Category1','Category1','Category1'], 'Second_Biggest_category': ['Category2','Category2','Category3'], 'Third_Biggest_category': ['Category4','Category4',[]], 'Fourth_Biggest_category': ['Category5','Category6',[]], 'Fifth_Biggest_category': [[],'Category7',[]] })
实现步骤
1. 编写路径获取函数
通过迭代从分类向上追溯父类,反转后得到从大到小的完整层级路径:
def get_full_path(category, hierarchy): path = [category] current = category # 向上遍历父类直到根节点 while hierarchy[current]: parent = hierarchy[current][0] path.append(parent) current = parent # 反转路径,转为从最大到最小的层级顺序 return path[::-1]
2. 筛选叶子节点
叶子节点指没有子类的分类(即没有其他分类将其作为父类):
all_cats = set(hierarchy.keys()) parent_cats = set() for parents in hierarchy.values(): parent_cats.update(parents) leaf_cats = all_cats - parent_cats
3. 收集路径并确定最大层级数
# 获取所有叶子节点的完整层级路径 all_paths = [get_full_path(leaf, hierarchy) for leaf in leaf_cats] # 确定最长路径的层级数,用于生成列名 max_level_count = max(len(path) for path in all_paths)
4. 构建DataFrame
生成对应层级的列名,填充路径到对应列,不足层级用[]补充:
# 生成列名列表 level_labels = ['Biggest', 'Second', 'Third', 'Fourth', 'Fifth'] columns = [f"{level_labels[i]}_category" for i in range(max_level_count)] # 填充每行数据,确保长度匹配最大层级数 filled_rows = [] for path in all_paths: row = path.copy() while len(row) < max_level_count: row.append([]) filled_rows.append(row) # 创建最终DataFrame import pandas as pd result_df = pd.DataFrame(filled_rows, columns=columns)
运行上述代码后,result_df将与期望输出完全一致。
注:本实现基于每个分类仅存在一个父类的前提,若需支持多父类场景,需调整路径获取及数据填充逻辑。
内容的提问来源于stack exchange,提问作者Mop
相关产品推荐
相关产品推荐

