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}}