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

时间:2019-04-25 15:00:47

标签: python pandas classification multilabel-classification

    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中工作。

2 个答案:

答案 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]