Преобразовать pandas список ребер в разреженную матрицу переходов со словарем для узлов строк и столбцов? - PullRequest
2 голосов
/ 24 января 2020

У меня есть большой массив данных со списком ребер в двудольном графе. Я хочу преобразовать его в матрицу разреженных переходов python.

Итак, у меня есть фрейм данных со списком ребер, связывающих узлы из части 1 (a, b, c) с частью (x, y, z). Ребра имеют кратность: в этом примере есть два ребра от b до y.

start  end  multiplicity
    a    x             1
    a    y             1
    b    y             2
    b    z             1
    c    x             1
    c    z             1

В результате я хочу получить разреженную матрицу, в данном случае 3x3. У меня есть словари для частей 1 и 2, указывающие, какому узлу соответствует какая строка и столбцы результирующей матрицы перехода:

dic1 = {'a':0,'b':1,'c':2}
dic2 = {'x':1,'y':0,'z':2}

Поэтому я хочу матрицу

  y x z
a 1 1 0
b 2 0 1
c 0 1 1

... но разреженным (csr_matrix, lil_matrix или coo_matrix). Я попытался перебрать список ребер, но он слишком медленный для длинных списков. Кроме того, подходы, основанные на pivot, будут генерировать полные матрицы, которые будут медленными и потребляющими память. Есть ли эффективный способ получить разреженную матрицу, которую я хочу

1 Ответ

2 голосов
/ 24 января 2020

Насколько я понимаю, вы можете попробовать pivot + reindex с Index.map ( Для удобства чтения я добавил 2 переменные m и final, которые можно заменить на одну после тестирования ):

m = df.pivot(*df).fillna(0).rename_axis(index=None,columns=None)
final = m.reindex(index=m.index[m.index.map(dic1)],columns=m.columns[m.columns.map(dic2)])

print(final)

     y    x    z
a  1.0  1.0  0.0
b  2.0  0.0  1.0
c  0.0  1.0  1.0
...