Панды: Как создать групповой индекс итеративно - PullRequest
2 голосов
/ 25 марта 2019

У меня есть фрейм данных в этом формате

| 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 , я назначаю этот идентификатор (2) также для group1 .Тогда id (3) есть (acc2, add2);Поскольку add2 уже является частью group1 (из предыдущего назначения), я назначаю id (3) также для group1 .

Аналогично, яхотите создать группы, в которых, если учетная запись или адрес уже есть в группе, все идентификаторы, в которых указана учетная запись или адрес, должны быть частью одной группы.

1 Ответ

1 голос
/ 25 марта 2019

Я считаю, что вам нужно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...