Решили немного развлечься с проблемой.
Вы можете преобразовать 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