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 |