Я повернул DataFrame с MultiIndex как для строк, так и для столбцов. Я собираюсь преобразовать фрейм данных в матрицу scipy.sparse
, чтобы я мог использовать ее в качестве входных данных для другой библиотеки.
Как я могу сохранить отображение между разреженной матрицей и индексом поворотного DataFrame? Например. строка 1 разреженной матрицы соответствует этим двум группам в MultiIndex, и аналогично столбец 1 в разреженной матрице соответствует этим группам в столбце MultiIndex
Редактировать: Я думаю, что самый простой способ будет преобразовать DataFrame в разреженную матрицу, выполнить матричную факторизацию, преобразовать выходные данные матричной факторизации обратно в DataFrame и добавить оригинальный MultiIndex
Edit2: пример кода по популярному запросу
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import scipy.sparse as sparse
In [4]: idx = pd.MultiIndex.from_product([['A', 'B', 'C'],
...: ['D', 'E', 'F']],
...: names=['Index1', 'Index2'])
In [5]: col = pd.MultiIndex.from_arrays([['1', '1', '1', '2', '2', '2', '3', '3', '3'],
...: ['4', '5', '6', '7', '8', '9', '10', '11', '12']],
...: names=['Col1', 'Col2'])
In [6]: data = np.ones((9,9))
In [7]: data.ravel()[np.random.choice(data.size, 70, replace=False)] = np.nan
In [8]: df = pd.DataFrame(data, idx, col)
In [9]: df
Out[9]:
Col1 1 2 3
Col2 4 5 6 7 8 9 10 11 12
Index1 Index2
A D NaN NaN NaN NaN 1.0 NaN 1.0 NaN NaN
E 1.0 NaN NaN NaN NaN NaN NaN NaN NaN
F NaN NaN 1.0 NaN NaN NaN NaN NaN 1.0
B D NaN NaN NaN NaN NaN NaN NaN 1.0 NaN
E NaN 1.0 1.0 1.0 NaN NaN NaN NaN NaN
F NaN NaN NaN NaN NaN NaN 1.0 NaN NaN
C D NaN NaN NaN NaN NaN NaN NaN NaN NaN
E NaN NaN NaN NaN NaN NaN NaN 1.0 NaN
F NaN NaN NaN NaN NaN NaN NaN NaN NaN
In [10]: sparse.csr_matrix(df)
Out[10]:
<9x9 sparse matrix of type '<class 'numpy.float64'>'
with 81 stored elements in Compressed Sparse Row format>
Итак, допустим, я хочу получить значения в разреженной матрице, соответствующие индексам 'A' и 'D' в столбце index 1. В пандах я могу просто
In [11]: df.loc[("A", "D"), "1"]
Out[11]:
Col2
4 NaN
5 NaN
6 NaN
Name: (A, D), dtype: float64
Но как это сделать с разреженной матрицей? Отсюда мой вопрос о отображении между разреженной матрицей и пандами MultiIndex