我有一个这种格式的数据框
| 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 已经是 group1 的一部分,因此我也将此id(2)分配给 group1 。 然后,id(3)是(acc2,add2);由于 add2 已经是 group1 的一部分(来自先前的分配),因此我还将id(3)也分配给 group1 。
类似地,我想创建一个组,如果帐户或地址已经在一个组中,则出现该帐户或地址的所有ID都应该属于同一组。
答案 0 :(得分:1)
我相信您需要:
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