📜  pandas 转向稀疏 - Python (1)

📅  最后修改于: 2023-12-03 14:45:04.936000             🧑  作者: Mango

Pandas 转向稀疏 - Python

在使用 Pandas 进行数据处理时,DataFrame 中往往会包含大量的空值。这些空值在计算时会产生很大的开销。为了减小这种开销,Pandas 引入了稀疏数据类型。稀疏数据类型是一种压缩存储的方式,它仅存储非空值,从而节省了存储空间和计算时间。

在本文中,我们将深入介绍 Pandas 中的稀疏数据类型,并演示如何在处理数据时转换为稀疏格式。

稀疏数据类型

Pandas 中提供了三种稀疏数据类型:SparseSeries、SparseDataFrame 和 SparsePanel。

SparseSeries

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

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。如果你的数据集中包含大量的空值,不妨尝试使用稀疏数据类型。