简介
本实验将指导你如何在 pandas 库中使用稀疏数据结构。在我们有大量数据,其中大部分数据相似(如零或 NaN)的情况下,这很有用,因此可以在内存中更有效地表示。我们将学习 SparseArray、SparseDtype、稀疏访问器、稀疏计算以及与 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 中使用稀疏数据结构以实现内存高效的存储和计算。我们使用了 SparseArray、SparseDtype 并进行了稀疏计算。我们还学习了如何在密集和稀疏格式之间进行转换,以及如何与 scipy 稀疏矩阵进行交互。