我正在尝试在新的 pandas 列中获取子父层次结构。目前我的代码看起来像这样,但它搜索所有父母,但它应该搜索相应行中的父母。
这是它应该如何工作的示例。
基表:
CHILD_ID | PARENT_ID |
---|---|
ITEM_1 | ITEM_A |
ITEM_2 | ITEM_B |
ITEM_A | ITEM_X |
ITEM_A | ITEM_Y |
ITEM_B | ITEM_Z |
第一次迭代
CHILD_ID | PARENT_ID | 层次结构 |
---|---|---|
ITEM_1 | ITEM_A | ITEM_1、ITEM_A |
ITEM_2 | ITEM_B | ITEM_2、ITEM_B |
ITEM_A | ITEM_X | ITEM_A、ITEM_X |
ITEM_A | ITEM_Y | ITEM_A、ITEM_Y |
ITEM_B | ITEM_Z | ITEM_B、ITEM_Z |
第二次迭代
CHILD_ID | PARENT_ID | 层次结构 |
---|---|---|
ITEM_1 | ITEM_A | ITEM_1、ITEM_A、ITEM_X |
ITEM_1 | ITEM_A | ITEM_1、ITEM_A、ITEM_Y |
ITEM_2 | ITEM_B | ITEM_2、ITEM_B、ITEM_Z |
ITEM_A | ITEM_X | ITEM_A、ITEM_X |
ITEM_A | ITEM_Y | ITEM_A、ITEM_Y |
ITEM_B | ITEM_Z | ITEM_B、ITEM_Z |
我正在努力实现这个结果,这是我的代码:
def get_parents(child_id):
list_of_parents = []
def dfs(child_id, parents_list):
parent_ids = df[df["child_id"] == child_id]["parent_id"].values
if len(parent_ids) == 0:
return
for parent_id in parent_ids:
if parent_id not in parents_list:
parents_list.append(parent_id)
dfs(parent_id, parents_list)
dfs(child_id, list_of_parents)
return list_of_parents
df["parent_hierarchy"] = df["child_id"].apply(get_parents)
usw 数据帧操作和递归函数的组合。 这是一个新代码,您应该能够在加载数据后实现它
def get_hierarchy(child_id, hierarchy=[]):
hierarchy.append(child_id)
parent_id = df.loc[df["CHILD_ID"] == child_id, "PARENT_ID"].values
if len(parent_id) > 0:
get_hierarchy(parent_id[0], hierarchy)
return hierarchy
df["Hierarchy"] = df["CHILD_ID"].apply(get_hierarchy)