我在 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 文档,但我只是不在那里。有人能指出我正确的方向吗?
我希望能够高效地完成诸如 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)
这会给你一个带标签的稀疏数据帧。