【发布时间】:2019-04-02 09:26:58
【问题描述】:
我已经在行和列上使用 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 之间的映射的问题
【问题讨论】:
-
没有任何数据很难把握问题。我会提供输入和预期输出。
-
@kull1n,我现在在原帖中放了一些示例代码。请看看这是否使问题更清楚