【问题标题】:Mapping between pandas MultiIndex and sparse matrixpandas MultiIndex 和稀疏矩阵之间的映射
【发布时间】: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,我现在在原帖中放了一些示例代码。请看看这是否使问题更清楚

标签: python pandas


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多