网络群集的唯一ID

时间:2017-01-08 15:02:19

标签: python pandas cluster-analysis networkx

我有一个节点网络(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

1 个答案:

答案 0 :(得分:0)

因此,如果我正确理解事物,这相当于有两种类型的节点:

  1. 您的DataFrame中的节点,其中包含(a, 101)
  2. DataFrame中列与值的组合
  3. ,此DataFrame是图表的边缘。

    因此,1连接到2& (b, 202)

    2连接到3& 1

    所以,所有23(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