在 Pandas 中使用稀疏结构

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验将指导你如何在 pandas 库中使用稀疏数据结构。在我们有大量数据,其中大部分数据相似(如零或 NaN)的情况下,这很有用,因此可以在内存中更有效地表示。我们将学习 SparseArraySparseDtype、稀疏访问器、稀疏计算以及与 scipy 稀疏矩阵的交互。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

创建稀疏数组

首先,我们创建一个稀疏数组,它是一种 pandas 数据结构,用于高效存储稀疏值数组。稀疏值是那些由于与大多数值相似而未被存储的值,因此被视为冗余值。

## 导入必要的库
import pandas as pd
import numpy as np

## 创建一个具有随机值的 numpy 数组
arr = np.random.randn(10)

## 将一些值设置为 NaN
arr[2:-2] = np.nan

## 使用 pandas 创建一个稀疏数组
ts = pd.Series(pd.arrays.SparseArray(arr))

## 输出稀疏数组
print(ts)

检查内存效率

接下来,我们将检查使用稀疏数据结构的内存效率。我们将创建一个大型 DataFrame,将其转换为稀疏格式,然后比较内存使用情况。

## 创建一个具有随机值的大型 DataFrame
df = pd.DataFrame(np.random.randn(10000, 4))

## 将 DataFrame 的大部分值设置为 NaN
df.iloc[:9998] = np.nan

## 将 DataFrame 转换为稀疏格式
sdf = df.astype(pd.SparseDtype("float", np.nan))

## 检查密集型与稀疏型 DataFrame 的内存使用情况
print('密集型 : {:0.2f} 千字节'.format(df.memory_usage().sum() / 1e3))
print('稀疏型:{:0.2f} 千字节'.format(sdf.memory_usage().sum() / 1e3))

理解 SparseDtype

SparseDtype 存储非稀疏值的数据类型和标量填充值。我们可以仅通过传递一个数据类型来构造它,也可以传递一个显式的填充值。

## 创建一个 SparseDtype
print(pd.SparseDtype(np.dtype('datetime64[ns]')))

## 创建一个带有显式填充值的 SparseDtype
print(pd.SparseDtype(np.dtype('datetime64[ns]'), fill_value=pd.Timestamp('2017-01-01')))

使用稀疏访问器

我们可以使用 .sparse 访问器来获取特定于稀疏数据的属性和方法。

## 创建一个具有稀疏值的 Series
s = pd.Series([0, 0, 1, 2], dtype="Sparse[int]")

## 使用稀疏访问器
print(s.sparse.density)
print(s.sparse.fill_value)

执行稀疏计算

我们可以将 NumPy 通用函数应用于 SparseArray,并得到一个 SparseArray 作为结果。

## 创建一个 SparseArray
arr = pd.arrays.SparseArray([1., np.nan, np.nan, -2., np.nan])

## 应用一个 NumPy 通用函数
print(np.abs(arr))

在稀疏和密集格式之间转换

我们可以轻松地将数据从稀疏格式转换为密集格式,反之亦然。

## 从稀疏转换为密集
print(sdf.sparse.to_dense())

## 从密集转换为稀疏
dense = pd.DataFrame({"A": [1, 0, 0, 1]})
dtype = pd.SparseDtype(int, fill_value=0)
print(dense.astype(dtype))

与 scipy 稀疏矩阵交互

最后,我们可以从 scipy 稀疏矩阵创建一个具有稀疏值的 DataFrame,反之亦然。

## 导入必要的库
from scipy.sparse import csr_matrix

## 使用 scipy 创建一个稀疏矩阵
arr = np.random.random(size=(1000, 5))
arr[arr <.9] = 0
sp_arr = csr_matrix(arr)

## 从稀疏矩阵创建一个 DataFrame
sdf = pd.DataFrame.sparse.from_spmatrix(sp_arr)

## 打印 DataFrame
print(sdf.head())
print(sdf.dtypes)

## 转换回稀疏矩阵
print(sdf.sparse.to_coo())

总结

在本实验中,我们学习了如何在 pandas 中使用稀疏数据结构以实现内存高效的存储和计算。我们使用了 SparseArraySparseDtype 并进行了稀疏计算。我们还学习了如何在密集和稀疏格式之间进行转换,以及如何与 scipy 稀疏矩阵进行交互。