python - 对具有稀疏列的 pandas.DataFrame 中的行进行基于索引的访问

标签 python pandas dataframe sparse-matrix

由于内存限制,我必须在 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/

相关文章:

python - Pandas - 如何对格式化为字符串的周数和年数进行排序?

python - 从python中的数据框行获取最大值

python - 根据列条件删除相同数量的行

java - 在同一个 Master 下的 Java 和 R Apps 之间共享 SparkContext

python - 切片字符串时 Python 中的奇怪行为 - 返回空字符串?

python - 如何在使用 celery-beat 完成上一个任务后 5 分钟内运行任务?

python - 如何根据配置文件(文本或CSV)中的用户输入过滤pandas数据框配置将告诉过滤器值和过滤列

python - 如何使用 Pandas 删除列值中 URL 字符串的第一部分?

python - 删除连续 Pandas 中的前导 0

python - 在 Dataframe 中展开嵌套字典