Python 在dataframe中创建父-子对字典

Python 在dataframe中创建父-子对字典,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个包含两列的数据框,如下所示: CHILD PARENT 1 2 2 3 3 4 10 11 11 12 我需要创建一个字典,在字典中,我将顶部父项作为键,将其所有子项作为一组值,如: 4: [1,2,3] 12: [10,11] 通过以下链接的代码,我已经能够从这个数据帧中提取12和4作为顶级父项: 现在,我不知道如何在python中实现这一点。在java中,我可以通过遵循dfs来实现这一点。有什么建议吗?这是network

我有一个包含两列的数据框,如下所示:

CHILD   PARENT
1       2
2       3
3       4
10      11
11      12
我需要创建一个字典,在字典中,我将顶部父项作为键,将其所有子项作为一组值,如:

4: [1,2,3]
12: [10,11]
通过以下链接的代码,我已经能够从这个数据帧中提取12和4作为顶级父项:

现在,我不知道如何在python中实现这一点。在java中,我可以通过遵循dfs来实现这一点。有什么建议吗?

这是networkx的方法

这是从networkx来的路

这里有一个BFS方法,它不是基于networkx,networkx是一个很棒的Python包,尽管不是它的一部分

代码:

输出:

这里有一个BFS方法,它不是基于networkx,networkx是一个很棒的Python包,尽管不是它的一部分

代码:

输出:


我只能考虑使用networkx,因为pandas不适合特定的数据结构。你可以从这个关系中构造一个图,然后,从那里,你所需要的就是找到彼此断开连接的各种子图?一个节点可以是不止一个父节点的后代吗?我只能考虑使用networkx,因为pandas不适合特定的数据结构。你可以从这个关系中构造一个图,然后,从那里,你所需要的就是找到彼此断开连接的各种子图?一个节点可以是多个父节点的后代吗?
import networkx as nx
G=nx.from_pandas_edgelist(df, 'CHILD', 'PARENT')
l=list(nx.connected_components(G))
L=[dict.fromkeys(y,x) for x, y in enumerate(l)]
d={k: v for d in L for k, v in d.items()}
df.groupby(df.CHILD.map(d)).agg({'CHILD':'unique','PARENT':'max'})
Out[328]: 
       PARENT      CHILD
CHILD                   
0           4  [1, 2, 3]
1          12   [10, 11]
from collections import defaultdict

import pandas as pd

df = pd.DataFrame(data=[[1, 2], [2, 3], [3, 4], [10, 11], [11, 12]],
                  columns=['CHILD', 'PARENT'])

# build graph
graph = defaultdict(set)
for child, parent in df[['CHILD', 'PARENT']].values:
    graph[parent].add(child)

# identity root nodes
roots = []
for node in graph.keys():
    if all(node not in children for children in graph.values()):
        roots.append(node)

# find the descendents of each root node
result = {}
for root in roots:
    visited = set()
    unvisited = graph[root]
    while unvisited:
        visited |= unvisited
        unvisited = set.union(*(graph[node] for node in unvisited)) - visited
    result[root] = visited

print(result)
{4: {1, 2, 3}, 12: {10, 11}}