首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pandas MultiIndex与稀疏矩阵的映射

pandas MultiIndex与稀疏矩阵的映射
EN

Stack Overflow用户
提问于 2018-10-29 20:36:16
回答 1查看 391关注 0票数 1

我透视了一个在行和列上都有MultiIndex的DataFrame。我将把数据帧转换成scipy.sparse矩阵,这样我就可以将它用作另一个库的输入。

如何保留稀疏矩阵和旋转DataFrame的索引之间的映射?例如,稀疏矩阵的行1对应于MultiIndex中的这两个组,类似地,稀疏矩阵中的列1对应于列MultiIndex中的这些组

编辑:我想最简单的方法是将DataFrame转换为稀疏矩阵,进行矩阵分解,将矩阵分解的输出转换回DataFrame,然后添加原始MultiIndex

Edit2:常见请求的代码示例

代码语言:javascript
运行
复制
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之间的映射

EN

回答 1

Stack Overflow用户

发布于 2018-11-02 05:10:42

您可以创建自定义映射函数map_rowmap_column作为字典,它们将从MultiIndex元组映射到Integer索引。

代码语言:javascript
运行
复制
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)]

然后像这样对稀疏矩阵进行切片:

代码语言:javascript
运行
复制
matrix[map_row("A", "E"), map_column("1","4")]

1.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53045649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档