我透视了一个在行和列上都有MultiIndex的DataFrame。我将把数据帧转换成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>
因此,假设我想要获取与列索引1中的索引'A‘和'D’对应的稀疏矩阵中的值。
In [11]: df.loc[("A", "D"), "1"] Out[11]: Col2 4 NaN 5 NaN 6 NaN Name: (A, D), dtype: float64
但是如何使用稀疏矩阵做到这一点呢?因此,我的问题是稀疏矩阵和pandas MultiIndex之间的映射
发布于 2018-11-02 05:10:42
您可以创建自定义映射函数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
https://stackoverflow.com/questions/53045649
复制相似问题