i j
1 2
1 3
3 2
4 5
5 6
7 8
9 10
. .
. .
. .
101 1
102 105
102 4
上表中的每一行代表一个人。 i 和 j 的列是该人的标识符,并且仅属于该人。这些标识符显示在多行中,因此,包含另一行的同一标识符的行将意味着那两行代表同一个人,并且这些行中的配对标识符也属于该个人。例如,第一行包含1和2,第二行包含1和3。由于这两行中都存在1,这意味着1,2和3是该人的标识符。一个人可以有任意多行。
我正在寻找一种有效的分类算法,该算法将所有标识符分组在一起,并分配一个唯一的ID,该ID代表分配给这些ID的个人。这是离散链分类问题的一种。我应该考虑使用某种算法或分类实践来帮助解决我的问题。如果有已知的库,我也在python和pandas中工作。
答案 0 :(得分:1)
您可以使用长度很大的链,因此最好使用图形。您可以使用带有两行代码的networkx库来解决您的问题:
import networkx as nx
data=[
[1, 2],
[1, 3],
[3, 2],
[4, 5],
[5, 6],
[7, 8],
[9, 10]
]
G = nx.Graph()
G.add_edges_from(data)
list(nx.connected_components(G))
返回:
[{1, 2, 3}, {4, 5, 6}, {7, 8}, {9, 10}]
您要查找的东西称为connected components。
答案 1 :(得分:1)
*也许这会对您有所帮助。
import pandas as pd
l1= ['i','j']
l2 = [[1,2],
[1,3],
[3,2],
[4,5],
[5,6],
[7,8],
[9,10],
[101,1],
[102,105],
[102,4]]
df = pd.DataFrame(l2, columns=l1)
print(df)
df = df.groupby('i')['j'].apply(list).reset_index(level='i')
print(df)
## ### Output ####
#Before
i j
0 1 2
1 1 3
2 3 2
3 4 5
4 5 6
5 7 8
6 9 10
7 101 1
8 102 105
9 102 4
#After
i j
0 1 [2, 3]
1 3 [2]
2 4 [5]
3 5 [6]
4 7 [8]
5 9 [10]
6 101 [1]
7 102 [105, 4]