我在行和列上都旋转了一个具有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之间的映射
答案 0 :(得分:0)
您可以创建自定义映射函数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