如何对多组别名进行分类以识别一个人
How to classify groups of aliases to identify one individual
i j
1 2
1 3
3 2
4 5
5 6
7 8
9 10
. .
. .
. .
101 1
102 105
102 4
上面的每一行table代表一个人。 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))
Returns:
[{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]
i j
1 2
1 3
3 2
4 5
5 6
7 8
9 10
. .
. .
. .
101 1
102 105
102 4
上面的每一行table代表一个人。 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))
Returns:
[{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]