Python数据分析NumPy和pandas(二十一、数据清洗和预处理之三:扩展数据类型)

pandas 最初是基于NumPy构建的,NumPy 是一个主要用于处理数值数据的数组计算库。许多 pandas 概念(例如缺失数据)是使用 NumPy 中可用的内容实现的,同时试图最大限度地提高同时使用 NumPy 和 pandas 的库之间的兼容性。

在 NumPy 上构建pandas也导致了许多缺点,例如:

1.某些数值数据类型 (如整数和布尔值) 的缺失数据处理不完整。因此,当缺失数据被引入此类数据时,pandas 将数据类型转换为 float64 并使用 np.nan 表示 null 值。这在许多 pandas 算法中引入了微妙的问题,从而产生了复合效应。

2.具有大量字符串数据的数据集计算成本高昂,并且使用大量内存。

3.如果不使用计算成本高昂的 Python 对象数组,则无法有效地支持某些数据类型,例如时间间隔、时间增量和带时区的时间戳。

pandas 开发了一个扩展类型系统,允许添加新的数据类型,即使 NumPy 本身不支持它们。这些新数据类型可以与来自 NumPy 数组的数据一起被视为同等。我们创建一个具有缺失值的 Series 整数数组:

import numpy as np
import pandas as pd

s = pd.Series([1, 2, 3, None])
print(s)
print(s.dtype)

输出:

0    1.0      
1    2.0      
2    3.0      
3    NaN      
dtype: float64
float64

主要是出于向后兼容性的原因,Series 使用 float64 数据类型和 np.nan 作为缺失值的。我们可以改用 pandas.Int64D 创建这个Series:

import numpy as np
import pandas as pd

s = pd.Series([1, 2, 3, None], dtype=pd.Int64Dtype())
print(s)
print(s.dtype)

输出:

0       1
1       2
2       3
3    <NA>
dtype: Int64
Int64

输出<NA>指示扩展类型数组缺少值。这使用特殊的 pandas.NA 哨兵值。

import numpy as np
import pandas as pd

s = pd.Series([1, 2, 3, None], dtype=pd.Int64Dtype())
print(s[3])
print(s[3] is pd.NA)

输出:

<NA>
True

我们也可以使用简写 “Int64” 而不是 pd.Int64Dtype()指定类型:

s = pd.Series([1, 2, 3, None], dtype="Int64")

pandas 还有一个专门用于字符串数据的扩展类型,它不使用 NumPy 对象数组(它需要 pyarrow 库,可能需要单独安装,之前我已经安装了pip install pyarrow):

import numpy as np
import pandas as pd

s = pd.Series(['one', 'two', None, 'three'], dtype=pd.StringDtype())
print(s)

输出:

0      one
1      two
2     <NA>
3    three
dtype: string

这些字符串数组通常使用更少的内存,并且在对大型数据集执行操作时,计算效率通常更高。

另一个重要的扩展类型是 Categorical,我们后面再学。以下是pandas 扩展数据类型列表:

扩展类型可以传递给 Series astype 方法,从而使得我们在数据清理过程中轻松转换。

import numpy as np
import pandas as pd

df = pd.DataFrame({"A": [1, 2, None, 4], 
                   "B": ["one", "two", "three", None], 
                   "C": [False, None, False, True]})
print(df)

df["A"] = df["A"].astype("Int64")
df["B"] = df["B"].astype("string")
df["C"] = df["C"].astype("boolean")

print(df)

前后输出对比:

A B C
0 1.0 one False
1 2.0 two None
2 NaN three False
3 4.0 None True

最后输出:

A B C
0 1 one False
1 2 two <NA>
2 <NA> three False
3 4 <NA> True

猜你喜欢

转载自blog.csdn.net/FreedomLeo1/article/details/143491322