我有一个这种格式的数据帧
| id | account | address |
|----|---------|---------|
| 1 | acc1 | add1 |
| 2 | acc1 | add2 |
| 3 | acc2 | add2 |
| 4 | acc3 | add3 |
| 5 | acc1 | add4 |
| 6 | acc4 | add5 |
| 7 | acc2 | add6 |
| 8 | acc5 | add7 |
| 9 | acc6 | add4 |
| 10 | acc7 | add8 |
| 11 | acc8 | add9 |
| 12 | acc2 | add10 |
| 13 | acc3 | add11 |
| 14 | acc9 | add12 |
现在,我想创建一个组索引,我想在其中查找帐户或地址已属于组的组。如下所示
| id | account | address | group_index |
|----|---------|---------|-------------|
| 1 | acc1 | add1 | group1 |
| 2 | acc1 | add2 | group1 |
| 3 | acc2 | add2 | group1 |
| 4 | acc3 | add3 | group2 |
| 5 | acc1 | add4 | group1 |
| 6 | acc4 | add5 | group3 |
| 7 | acc2 | add6 | group1 |
| 8 | acc5 | add7 | group4 |
| 9 | acc6 | add4 | group1 |
| 10 | acc7 | add8 | group5 |
| 11 | acc8 | add9 | group6 |
| 12 | acc2 | add10 | group7 |
| 13 | acc3 | add11 | group2 |
| 14 | acc9 | add12 | group8 |
因此,首先我从 id(1( = (acc1, add1( 开始,并分配一个组索引,例如 group1。然后, id(2( 是 (acc1, add2(;由于 acc1 已经是组 1 的一部分,所以我将此 id(2( 也分配给组 1。然后, id(3( 是 (acc2, add2(;由于 add2 已经是组 1 的一部分(来自以前的分配(,我将 id(3( 也分配给组 1。
同样,我想创建组,如果帐户或地址已经在组中,则显示帐户或地址的所有ID,它们都应该属于同一组。
我相信你需要:
import networkx as nx
# Create the graph from the dataframe
g = nx.Graph()
g.add_edges_from(df[['account','address']].itertuples(index=False))
connected_components = nx.connected_components(g)
# Find the component id of the nodes
node2id = {}
for cid, component in enumerate(connected_components):
for node in component:
node2id[node] = 'group' + str(cid + 1)
df['new'] = df['account'].map(node2id)
print (df)
id account address new
0 1 acc1 add1 group1
1 2 acc1 add2 group1
2 3 acc2 add2 group1
3 4 acc3 add3 group2
4 5 acc1 add4 group1
5 6 acc4 add5 group3
6 7 acc2 add6 group1
7 8 acc5 add7 group4
8 9 acc6 add4 group1
9 10 acc7 add8 group5
10 11 acc8 add9 group6
11 12 acc2 add10 group1
12 13 acc3 add11 group2
13 14 acc9 add12 group7