Преобразовать список ребер в матрицу смежности - PullRequest
0 голосов
/ 11 ноября 2018

Мой dataframe представляет список ребер графа и имеет следующий формат:

  node1 node2 weight
0     a     c      1
1     b     c      2
2     d     c      3

Моя цель - создать эквивалентную матрицу смежности:

    a b c d
a   0 0 1 0
b   0 0 2 0
c   0 0 0 3
d   0 0 0 0

В данный момент при построении кадра данных ребер я считаю количество узлов, создаю кадр данных NxN и заполняю значения вручную. как pandas создает второй кадр данных из первого?

Ответы [ 2 ]

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

Решили немного развлечься с проблемой.

Вы можете преобразовать node1 и node2 в категориальный dtype, а затем использовать groupby.

from functools import partial

vals = np.unique(df[['node1', 'node2']])
p = partial(pd.Categorical, categories=vals) 
df['node1'], df['node2'] = p(df['node1']), p(df['node2'])

(df.groupby(['node1', 'node2'])
   .first()
   .fillna(0, downcast='infer')
   .weight
   .unstack())

node2  a  b  c  d
node1            
a      0  0  1  0
b      0  0  2  0
c      0  0  0  0
d      0  0  3  0

Другой вариант - установка значений базового массива напрямую.

df2 = pd.DataFrame(0, index=vals, columns=vals)
f = df2.index.get_indexer
df2.values[f(df.node1), f(df.node2)] = df.weight.values

print(df2)
   a  b  c  d
a  0  0  1  0
b  0  0  2  0
c  0  0  0  0
d  0  0  3  0
0 голосов
/ 11 ноября 2018

Используйте pivot с reindex

In [20]: vals = np.unique(df[['node1', 'node2']])

In [21]: df.pivot(index='node1', columns='node2', values='weight'
                  ).reindex(columns=vals, index=vals, fill_value=0)
Out[21]:
node2  a  b  c  d
node1
a      0  0  1  0
b      0  0  2  0
c      0  0  0  0
d      0  0  3  0

Или используйте set_index и unstack

In [27]: (df.set_index(['node1', 'node2'])['weight'].unstack()
            .reindex(columns=vals, index=vals, fill_value=0))
Out[27]:
node2  a  b  c  d
node1
a      0  0  1  0
b      0  0  2  0
c      0  0  0  0
d      0  0  3  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...