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的个体。这是一种离散链分类问题。是否有一种算法或分类实践我应该研究以帮助解决我的问题。如果有已知的库,我也在python和pandas工作。
你可以拥有非常大的链条,因此最好使用图表。你的问题可以用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。
*也许这会对你有所帮助。
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]