熊猫:如何迭代创建组索引

时间:2019-03-25 11:23:11

标签: python pandas pandas-groupby

我有一个这种格式的数据框

| 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都应该属于同一组。

1 个答案:

答案 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