如何对别名组进行分类以识别一个人

问题描述 投票:-1回答:2
    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工作。

python pandas classification multilabel-classification
2个回答
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
投票

*也许这会对你有所帮助。

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]
© www.soinside.com 2019 - 2024. All rights reserved.