使用稀疏列对 pandas.DataFrame 中的行进行基于索引的访问

Index-based access to rows in pandas.DataFrame with Sparse columns

由于内存限制,我必须在 pandas.DataFrame(pandas 版本 1.0.5)中使用稀疏列。 不幸的是,通过基于索引的行访问(使用 .loc[]),我 运行 遇到以下问题:

df = pd.DataFrame.sparse.from_spmatrix(
    scipy.sparse.csr_matrix([[0, 0, 0, 1],
                             [1, 0, 0, 0],
                             [0, 1, 0, 0]])
)
df

输出:

    0   1   2   3
0   0   0   0   1
1   1   0   0   0
2   0   1   0   0

如果使用 .loc:

df.loc[[0,1]]

输出:

    0   1   2       3
0   0   0   NaN     1
1   1   0   NaN     0

理想情况下,我希望第二列也有 0s。我对这里发生的事情的假设是内部 csc 矩阵表示以及我正在访问不包含任何非零值的列的行中的值最初与填充值混淆的事实。 dtypes 对此表示反对:

df.loc[[0,1]].dtypes

输出:

0         Sparse[int32, 0]
1         Sparse[int32, 0]
2       Sparse[float64, 0]
3         Sparse[int32, 0]

(请注意,填充值仍为 0,即使第 2 列的视图 dtype 已从 Sparse[int32, 0] 更改为 Sparse[float64, 0])。

谁能告诉我是否所有出现在具有稀疏列的行切片 pd.DataFrame 中的所有 NaN 确实指的是各自的零值并且不会“隐藏”任何实际的非零值条目?有没有一种“安全”的方法可以在 pd.DataFrame 上使用稀疏列来使用基于索引的行访问?

所以这确实是 pandas 中的一个错误,已在版本 1.1.0 中修复(参见 GitHub for an issue description and the changelog for 1.1.0)。

在 1.1.0 中,最小示例有效:

df = pd.DataFrame.sparse.from_spmatrix(
    scipy.sparse.csr_matrix([[0, 0, 0, 1],
                             [1, 0, 0, 0],
                             [0, 1, 0, 0]])
)
df.loc[[0, 1]]

输出:

    0   1   2   3
0   0   0   0   1
1   1   0   0   0