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

如何预处理多层分类DataFrame以与交易DataFrame合并?

高效解决方案:基于字典映射与Pandas矢量化操作

核心思路

  1. 将DF2的父子分类关系转化为父节点字典映射,避免重复查询DataFrame;
  2. 用迭代方式生成每个分类的完整层级路径(从叶子节点到根节点);
  3. 统一所有路径的长度,不足的前面补None以对齐层级;
  4. 将路径展开为多列后与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:35:56