Отображение между пандами MultiIndex и разреженной матрицей - PullRequest
0 голосов
/ 29 октября 2018

Я повернул 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

1 Ответ

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

Вы можете создать свои пользовательские функции отображения map_row и map_column в качестве словарей, которые будут отображаться из MultiIndex кортежей в Integer индекс.

def map_row(r1, r2):
    mapping = dict(zip(df.index, range(len(df.index))))
    return mapping[(r1, r2)]

def map_column(c1, c2):
    mapping = dict(zip(df.columns, range(len(df.columns))))
    return mapping[(c1, c2)]

А затем нарежьте разреженную матрицу, как:

matrix[map_row("A", "E"), map_column("1","4")]

1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...