pandas/scipy 中带有行和列索引的稀疏矩阵

问题描述 投票:0回答:1

我在 pandas 中有一个数据框,如下所示:

>>> df[['BranchNumber', 'ModelArticleNumber', 'ActualSellingPrice']].info()
<class 'pandas.core.frame.DataFrame'>
Index: 447970 entries, 0 to 500734
Data columns (total 3 columns):
 #   Column              Non-Null Count   Dtype  
---  ------              --------------   -----  
 0   BranchNumber        447970 non-null  int64  
 1   ModelArticleNumber  447970 non-null  object 
 2   ActualSellingPrice  447970 non-null  float64
dtypes: float64(1), int64(1), object(1)
memory usage: 13.7+ MB

鉴于有 463 个唯一分支编号和 5,235 个模型文章编号,我想创建一个带有索引的 463x5,235 稀疏矩阵。以下是我已经取得的进展:

import numpy as np
import scipy

def index(df):
    ix = { v: n for n, v in enumerate(df.unique()) }
    return np.array(list(map(lambda value: ix[value], df)))

def csr(df, row_tag, col_tag, value_tag):
    m = scipy.sparse.csr_matrix(
        (
            df[value_tag],
            (
                index(df[row_tag]),
                index(df[col_tag])
            )
        )
    )
        
    return m

我希望能够高效地执行

m.T.dot(m)
之类的操作,并保留查看哪个键与行和列关联的能力。我浏览了有关 pandas 索引和数组的文档,以及有关稀疏矩阵的 scipy 文档,但我只是不在那里。有人能指出我正确的方向吗?

python pandas scipy sparse-matrix
1个回答
0
投票

我希望能够高效地完成诸如 m.T.dot(m) 之类的事情,...

这个设计看起来是一个合理的方法。

...并保留查看哪个键与行和列关联的能力。

那就更复杂了。 SciPy 稀疏数组本身不支持标记数据。不过,您可以将行/列映射保留在单独的变量中。您可以使用

pd.factorize()
同时创建行/列索引和行/列索引。

例如

def csr(df, row_tag, col_tag, value_tag):
    rows, row_labels = pd.factorize(df[row_tag])
    cols, col_labels = pd.factorize(df[col_tag])
    m = scipy.sparse.csr_matrix(
        (
            df[value_tag],
            (
                rows,
                cols
            )
        ),
        shape=(len(row_labels), len(col_labels))
    )

    return m, row_labels, col_labels

那么如果你想知道

m[10, 20]
中的内容的标签,你可以查看
row_labels[10]
col_labels[20]

或者,您可以使用稀疏 DataFrame。 Pandas 有一个数据类型 SparseDtype,它以稀疏格式存储列的数据。使用之前的

csr()
方法,您可以执行以下操作:

m, row_labels, col_labels = csr(df, 'BranchNumber', 'ModelArticleNumber', 'ActualSellingPrice')
df_sparse = pd.DataFrame.sparse.from_spmatrix(m, index=row_labels, columns=col_labels)

这会给你一个带标签的稀疏数据帧。

© www.soinside.com 2019 - 2024. All rights reserved.