Группировать по столбцу со значениями, разделенными точкой с запятой, во фрейме данных pandas - PullRequest
0 голосов
/ 11 сентября 2018

Представьте себе pandas кадр данных, заданный

import pandas as pd

df = pd.DataFrame({
    'id': range(5),
    'vmns': ('nan', 'a', 'a;b', 'c', 'b')
})

, который дает следующую таблицу

   id vmns
0   0  nan
1   1    a
2   2  a;b
3   3    c
4   4    b

Теперь я хочу сгруппировать по столбцу vmns, но обратите внимание на разделенную точку с запятойзначение для vmns для id = 2.Это должно интерпретироваться как a или b, поэтому создается связь между этими значениями.Следовательно, итоговая таблица должна выглядеть следующим образом:

   id vmns  group
0   0  nan      0
1   1    a      1
2   2  a;b      1
3   3    c      2
4   4    b      1

Есть предложения?

1 Ответ

0 голосов
/ 11 сентября 2018

Я пошел дальше и создал решение, используя networkx.Это выглядит следующим образом (расширенный пример)

import networkx as nx
import pandas as pd

df = pd.DataFrame({
    'id': range(7),
    'vmns': ('nan', 'a', 'a;b;c', 'c', 'b', 'd;e', 'e')
})

, что дает

   id   vmns
0   0    nan
1   1      a
2   2  a;b;c
3   3      c
4   4      b
5   5    d;e
6   6      e

Затем я создаю узлы из строк без точки с запятой и ребер из строк с точкой с запятой.Строки с nan игнорируются.

# determine which rows contains nodes and which contains edges
edges_mask = df['vmns'].str.contains(';')
nodes_mask = ~df['vmns'].str.contains(';') & (df['vmns'] != 'nan')

def create_pairwise_edges(lst):
    return [(lst[0], value) for value in lst[1:]]

# create the graph with nodes and edges
G = nx.Graph()
G.add_nodes_from(df.loc[nodes_mask, 'vmns'])
G.add_edges_from([st for row in df.loc[edges_mask, 'vmns'].str.split(';').map(create_pairwise_edges) for st in row])

# determine the connected components and write to df
Gcc = nx.connected_components(G)
new_map = dict()
for g, ids in enumerate(Gcc):
    for id in ids:
        new_map[id] = g
new_map['nan'] = 'nan'
df['combined_group'] = df['vmns'].str.split(';').map(lambda x: new_map[x[0]])

Результат -

   id   vmns combined_group
0   0    nan            nan
1   1      a              0
2   2  a;b;c              0
3   3      c              0
4   4      b              0
5   5    d;e              1
6   6      e              1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...