使用家谱SQL或Python创建每个人的列表

问题描述 投票:0回答:1

我有一张表,其中所有父母都与孩子相关联。一位父母可以有一个或多个孩子。一个孩子可以有多个父母之一。任何没有任何链接的项目都不在链接表中。这是它的外观示例。

家长 孩子
A B
A C
A D
D E
G H
J
J K
L M
O M
N P
R
R P

我理想的输出是一个家庭中所有项目的列表。例如:

Family 1 = [A, B, C, D, E]  
Family 2 = [G, H]  
Family 3 = [I, J, K]  
Family 4 = [L, M, O]  
Family 5 = [P, N, Q, R]  

我尝试过的事情:

  1. SQL 中的递归查询查找最顶层的祖先,然后查找后代。问题:因为最顶层的祖先甚至可能是 3 个父母,所以越来越难以深入分析
  2. 在Python中甚至循环遍历单行。对于第一行标签,该标签链接一个家庭。然后,第二行将检查是否有任何链接的项目在系列 1 中,如果是,则将其添加到系列中,如果不是,则成为一个新系列。对每一行重复此操作。问题:族 5 提出了一个有趣的问题,因此 [P,N] 将是一个族,然后是 [Q,R],但是当遇到链接 R > P 时,我需要考虑匹配两个族的链接并将它们合并或合并在结束。

我有大约 15000 个链接,我想这样做,并且正在寻找有效的东西。我对 python 和 SQL 以及递归或其他方法的使用持开放态度。谢谢!

python sql recursion tree
1个回答
0
投票

假设你有这个数据框:

   Parent Child
0       A     B
1       A     C
2       A     D
3       D     E
4       G     H
5       I     J
6       J     K
7       L     M
8       O     M
9       N     P
10      Q     R
11      R     P

然后可以使用

networkx
来获取所有连通分量:

import networkx as nx

G = nx.Graph()
for p, c in zip(df.Parent, df.Child):
    G.add_edge(p, c)

for c in nx.connected_components(G):
    print(c)

打印:

{'A', 'C', 'D', 'B', 'E'}
{'G', 'H'}
{'K', 'J', 'I'}
{'M', 'L', 'O'}
{'P', 'R', 'N', 'Q'}
© www.soinside.com 2019 - 2024. All rights reserved.