如何预处理多层分类DataFrame以与交易DataFrame合并?
高效解决方案:基于字典映射与Pandas矢量化操作
核心思路
- 将DF2的父子分类关系转化为父节点字典映射,避免重复查询DataFrame;
- 用迭代方式生成每个分类的完整层级路径(从叶子节点到根节点);
- 统一所有路径的长度,不足的前面补
None以对齐层级; - 将路径展开为多列后与DF1合并,全程避免嵌套循环。
完整代码实现
import pandas as pd # 初始化示例数据 df1 = pd.DataFrame({ '交易ID': [1, 2, 3], 'Category_id': ['Apples', 'Garlic', 'Car'] }) df2 = pd.DataFrame({ 'category_id': ['Apples', 'Garlic', 'Fruit', 'Veg', 'Car'], 'parent_id': ['Fruit', 'Veg', None, None, None] }) # 1. 构建父节点映射字典(O(n)时间复杂度) parent_map = df2.set_index('category_id')['parent_id'].to_dict() # 2. 定义函数生成从当前节点到根的层级路径 def get_full_hierarchy(node): hierarchy = [] current = node while current is not None: hierarchy.append(current) current = parent_map.get(current) # 字典查询,O(1)时间 return hierarchy # 3. 为DF1的每个分类生成层级路径(矢量化apply,比嵌套循环高效) df1['hierarchy'] = df1['Category_id'].apply(get_full_hierarchy) # 4. 确定最大层级数,统一所有路径长度 max_levels = df1['hierarchy'].str.len().max() # 5. 为短路径前面补None,对齐层级 df1['padded_hierarchy'] = df1.apply( lambda row: [None] * (max_levels - len(row['hierarchy'])) + row['hierarchy'], axis=1 ) # 6. 将层级路径展开为多列 hierarchy_columns = pd.DataFrame(df1['padded_hierarchy'].tolist(), index=df1.index) hierarchy_columns.columns = [f'Category_{i}' for i in range(max_levels)] # 7. 合并得到最终结果 final_result = pd.concat([df1[['交易ID']], hierarchy_columns], axis=1) print(final_result)
输出结果
交易ID Category_0 Category_1 0 1 Apples Fruit 1 2 Garlic Veg 2 3 None Car
效率优势
- 父节点查询用字典实现,时间复杂度O(1),远快于DataFrame的
loc/query查询; - 全程使用Pandas的矢量化操作(
apply、str.len等),避免了嵌套循环遍历两个DataFrame的O(m*n)时间复杂度,数据量越大,效率提升越明显。
内容的提问来源于stack exchange,提问作者user27210932
相关产品推荐
相关产品推荐

