我有一个节点网络(parends / childs,每个都有一个id),并希望为每个连接节点集群生成一个唯一的ID。我正在使用Python,Pandas和networkx。
例如,我有
id a b c
1 101 201 301
2 101 202 302
3 102 202 302
4 103 203 303
5 103 204 304
例如,在列a
中,第1行和第2行是链接的。
我想获得
id a b c id_cluster
1 101 201 301 1
2 101 202 302 1
3 102 202 302 1
4 103 203 303 2
5 103 204 304 2
答案 0 :(得分:0)
因此,如果我正确理解事物,这相当于有两种类型的节点:
(a, 101)
,此DataFrame是图表的边缘。
因此,1
连接到2
& (b, 202)
和2
连接到3
& 1
所以,所有2
,3
,(a, 101)
,(a, 102)
,(b, 201)
,(b, 202)
,(c, 301)
,{ {1}}已与(c, 302)
相关联。
我不熟悉networkx
,但似乎有一个名为connected_components
的函数可以为您提供连接的子图。所以,
import pandas as pd
import networkx as nx
from StringIO import StringIO
df = pd.read_table(StringIO("""
id a b c
1 101 201 301
2 101 202 302
3 102 202 302
4 103 203 303
5 103 204 304"""), delim_whitespace=True)
df = df.set_index('id')
G = nx.Graph()
for (id_, column), other_node in df.stack().iteritems():
G.add_edge(id_, (column, other_node))
cluster_map = pd.Series(
{id_: id_cluster + 1
for id_cluster, ids in enumerate(nx.connected_components(G))
for id_ in ids
if not isinstance(id_, tuple)},
name='id_cluster')
df = df.join(cluster_map)
print(df)
产量
a b c id_cluster
id
1 101 201 301 1
2 101 202 302 1
3 102 202 302 1
4 103 203 303 2
5 103 204 304 2