由于内存限制,我必须在 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
理想情况下,我希望第二列也有 0
。我对这里发生的事情的假设是内部 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 列的 View 的 dtype
已从 Sparse[int32, 0] 更改
到 Sparse[float64, 0]
)。
谁能告诉我是否所有出现在具有稀疏列的行切片 pd.DataFrame
中的 NaN
确实指的是各自的零值并且不会“隐藏” “任何实际的非零条目?是否有一种“安全”的方式在具有稀疏列的 pd.DataFrame
上使用基于索引的行访问?
最佳答案
所以这确实是 pandas
中的一个错误,已在 1.1.0 版中修复(请参阅 GitHub 了解问题描述和 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
关于python - 对具有稀疏列的 pandas.DataFrame 中的行进行基于索引的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63196925/