首页 > 解决方案 > python在图中查找集群成员

问题描述

在 python 中,我试图解决我以前在 R 中遇到的相同问题:

import pandas as pd, numpy as np
df = pd.DataFrame({"id1": [1,1,2,2,3,3,4,4,5,5,6,6,np.NaN,np.NaN],
                   "id2": ['a',np.NaN,'a','c','c','d','x',np.NaN,'y','z','x','z',np.NaN,np.NaN],
                   "id3": [1,1,1,1,1,1,2,2,2,2,2,2,np.NaN,np.NaN]})

我希望 python 计算列id3,即分配网络集群成员(理想情况下忽略 NA)

在 R 中:

g <- graph_from_data_frame(df, FALSE)
cg <- clusters(g)$membership
df$id4 <- cg[df$id1]
df

标签: pythonpandasnetworkx

解决方案


我们可以生成一个networkx源和目标设置为id1and的无向图id2,然后enumerate在图中的连通分量上创建一个映射字典,并在列上创建map这个字典id1

import networkx as nx

G = nx.from_pandas_edgelist(df.dropna(), 'id1', 'id2')
df['id3'] = df['id1'].map({c: i for i, cc in enumerate(
                           nx.connected_components(G), 1) for c in cc})

    id1  id2  id3
0   1.0    a  1.0
1   1.0  NaN  1.0
2   2.0    a  1.0
3   2.0    c  1.0
4   3.0    c  1.0
5   3.0    d  1.0
6   4.0    x  2.0
7   4.0  NaN  2.0
8   5.0    y  2.0
9   5.0    z  2.0
10  6.0    x  2.0
11  6.0    z  2.0
12  NaN  NaN  NaN
13  NaN  NaN  NaN

推荐阅读