如何用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 Name | Parent Group ID | Group ID | Top Parent Group Name |
|---|---|---|---|
| All Foods | NaN | 1 | All Foods |
| Pasta | 1 | 2 | All Foods |
| Spaghetti | 2 | 3 | All Foods |
| Tomato Sauce | 1 | 4 | All Foods |
| Marinara | 4 | 5 | All Foods |
这个逻辑完全匹配你设想的流程:遍历每行→拿当前Group ID→找对应父ID→循环直到父ID为空→填入顶级组名。而且比直接在DataFrame里循环查找效率高很多,因为字典的查找是O(1)的。
内容的提问来源于stack exchange,提问作者vile_goat
相关产品推荐
相关产品推荐

