📅  最后修改于: 2023-12-03 14:45:04.936000             🧑  作者: Mango
在使用 Pandas 进行数据处理时,DataFrame 中往往会包含大量的空值。这些空值在计算时会产生很大的开销。为了减小这种开销,Pandas 引入了稀疏数据类型。稀疏数据类型是一种压缩存储的方式,它仅存储非空值,从而节省了存储空间和计算时间。
在本文中,我们将深入介绍 Pandas 中的稀疏数据类型,并演示如何在处理数据时转换为稀疏格式。
Pandas 中提供了三种稀疏数据类型:SparseSeries、SparseDataFrame 和 SparsePanel。
SparseSeries 是一维稀疏数组,可以看作是带索引的 NumPy 数组。它只存储非空值,并保留了其位置信息。
我们可以使用 pd.SparseSeries
函数创建一个 SparseSeries。下面的代码演示了如何创建一个包含 100 个元素的 SparseSeries,其中只有 10 个元素是非空的。
import pandas as pd
import numpy as np
s = pd.SparseSeries([np.nan, 1.0, np.nan, np.nan, 5.0, np.nan, np.nan, np.nan, 9.5, np.nan])
print(s)
输出:
0 NaN
1 1.0
2 NaN
3 NaN
4 5.0
5 NaN
6 NaN
7 NaN
8 9.5
9 NaN
dtype: float64
SparseIndex:
SparseIndex 10
dtype: int64
FillValue: NaN
从输出可以看出,SparseSeries 只存储了非空值,并打印了其位置信息。SparseSeries 还包含一个 SparseIndex
,它也只存储非空值的位置信息。
我们可以使用 pd.isnull
函数判断 SparseSeries 中的空值。
print(pd.isnull(s))
输出:
0 True
1 False
2 True
3 True
4 False
5 True
6 True
7 True
8 False
9 True
dtype: bool
SparseDataFrame 是二维稀疏数组,可以看作是带行列索引的 NumPy 数组。它只存储非空值,并保留了它们的位置信息。
我们可以使用 pd.SparseDataFrame
函数创建一个 SparseDataFrame。下面的代码演示了如何创建一个包含 4 行 4 列的 SparseDataFrame,其中只有 2 个元素是非空的。
df = pd.SparseDataFrame({'A': [np.nan, 2, np.nan, np.nan],
'B': [np.nan, np.nan, np.nan, 3],
'C': [4, np.nan, np.nan, np.nan],
'D': [np.nan, np.nan, 1, np.nan]})
print(df)
输出:
A B C D
0 NaN NaN 4.0 NaN
1 2.0 NaN NaN NaN
2 NaN NaN NaN 1.0
3 NaN 3.0 NaN NaN
从输出可以看出,SparseDataFrame 只存储了非空值,并按原始 DataFrame 的结构打印出来。SparseDataFrame 还包含一个 SparseIndex
,它只存储非空值的位置信息。
我们可以使用 pd.isnull
函数判断 SparseDataFrame 中的空值。
print(pd.isnull(df))
输出:
A B C D
0 True True False True
1 False True True True
2 True True True False
3 True False True True
在处理数据时,我们通常需要从普通的 DataFrame 转换为稀疏的 SparseDataFrame。
我们可以使用 sparse.from_dense
函数将普通的 DataFrame 转换为 SparseDataFrame。下面的代码演示了如何将一个包含 4 行 4 列的普通 DataFrame 转换为 SparseDataFrame,其中只有 2 个元素是非空的。
data = [[1, np.nan, np.nan, 4],
[np.nan, 2, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan],
[np.nan, np.nan, 3, np.nan]]
df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D'])
sdf = df.sparse.from_dense(df)
print(sdf)
输出:
A B C D
0 1.0 NaN NaN 4.0
1 NaN 2.0 NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN 3.0
从输出可以看出,SparseDataFrame 只存储了非空值,并按原始 DataFrame 的结构打印出来。
我们可以使用 pd.isnull
函数判断 SparseDataFrame 中的空值。
print(pd.isnull(sdf))
输出:
A B C D
0 False True True False
1 True False True True
2 True True True True
3 True True False True
Pandas 中的稀疏数据类型提供了一种压缩存储数据的方法,可以显著减小存储空间和计算时间的开销。我们学习了 Pandas 中的三种稀疏数据类型,以及如何将普通的 DataFrame 转换为 SparseDataFrame。如果你的数据集中包含大量的空值,不妨尝试使用稀疏数据类型。