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

如何用Pandas迭代追溯嵌套分组的顶级父组名称?

嘿,我懂你现在要解决的这个嵌套分组找顶级父组的问题!之前用Pandas的outer join没成功很正常,因为嵌套层级不确定的话,join的次数没法提前确定,反而用你设想的那种循环/递归遍历的思路更靠谱。下面我给你具体实现代码,完全贴合你的需求流程:

第一步:准备测试数据(模拟你的场景)

先拿一个符合你结构的示例DataFrame来演示:

import pandas as pd

# 模拟你的分组数据
data = [
    ["All Foods", None, 1],
    ["Pasta", 1, 2],
    ["Spaghetti", 2, 3],
    ["Tomato Sauce", 1, 4],
    ["Marinara", 4, 5]
]
df = pd.DataFrame(data, columns=["Group Name", "Parent Group ID", "Group ID"])

第二步:构建快速查找的映射字典

为了避免每次在列里查找的低效,我们把数据转成以Group ID为键的字典,这样能直接通过ID快速拿到对应的组名和父ID:

# 生成{Group ID: {"Group Name": xxx, "Parent Group ID": xxx}}的映射
group_map = df.set_index("Group ID").to_dict(orient="index")

第三步:实现递归/迭代函数找顶级父组

这里提供两种方式,选你习惯的就行:

方式1:递归实现(代码简洁,适合嵌套不极深的场景)

def get_top_parent_recursive(group_id):
    current_group = group_map[group_id]
    # 如果当前组没有父ID,说明就是顶级组
    if pd.isna(current_group["Parent Group ID"]):
        return current_group["Group Name"]
    # 否则递归查找父组的顶级父组
    else:
        return get_top_parent_recursive(current_group["Parent Group ID"])

方式2:迭代实现(避免递归深度限制,适合极深嵌套)

def get_top_parent_iterative(group_id):
    current_id = group_id
    while True:
        current_group = group_map[current_id]
        parent_id = current_group["Parent Group ID"]
        # 找到无父ID的顶级组就返回名称
        if pd.isna(parent_id):
            return current_group["Group Name"]
        # 否则继续往上找父组
        current_id = parent_id

第四步:给原表新增顶级父组列

用apply把函数应用到每一行的Group ID上,直接生成新列:

# 选递归或迭代函数都行,这里用递归举例
df["Top Parent Group Name"] = df["Group ID"].apply(get_top_parent_recursive)

运行后你会得到符合预期的结果:

Group NameParent Group IDGroup IDTop Parent Group Name
All FoodsNaN1All Foods
Pasta12All Foods
Spaghetti23All Foods
Tomato Sauce14All Foods
Marinara45All Foods

这个逻辑完全匹配你设想的流程:遍历每行→拿当前Group ID→找对应父ID→循环直到父ID为空→填入顶级组名。而且比直接在DataFrame里循环查找效率高很多,因为字典的查找是O(1)的。

内容的提问来源于stack exchange,提问作者vile_goat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:05:24