熊猫MultiIndex与稀疏矩阵之间的映射

时间:2018-10-29 12:36:16

标签: python pandas

我在行和列上都旋转了一个具有MultiIndex的DataFrame。我将把数据帧转换成scipy.sparse矩阵,以便可以将其用作另一个库的输入。

如何保留稀疏矩阵和数据透视表的索引之间的映射?例如。稀疏矩阵的第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>

所以,可以说我想在稀疏矩阵中获取与列索引1中的索引“ A”和“ D”相对应的值。在熊猫中,我可以简单地

In [11]: df.loc[("A", "D"), "1"] Out[11]: Col2 4 NaN 5 NaN 6 NaN Name: (A, D), dtype: float64

但是如何使用稀疏矩阵呢?因此,我的问题是稀疏矩阵和熊猫MultiIndex之间的映射

1 个答案:

答案 0 :(得分:0)

您可以创建自定义映射函数map_rowmap_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