问题描述
在 python 中,我试图解决我以前在 R 中遇到的同样问题:
import pandas as pd,numpy as np
df = pd.DataFrame({"id1": [1,1,2,3,4,5,6,np.NaN,np.NaN],"id2": ['a','a','c','d','x','y','z',"id3": [1,np.NaN]})
我希望python计算列id3
,即分配网络集群成员(理想情况下忽略NA)
在 R 中:
g <- graph_from_data_frame(df,FALSE)
cg <- clusters(g)$membership
df$id4 <- cg[df$id1]
df
解决方法
我们可以生成一个无向的networkx
图,源和目标设置为id1
和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