Pandas 中的缺失值处理与分层索引
1. 缺失值处理的方法与权衡
在数据处理中,缺失值是一个常见的问题,有多种处理缺失值的方法,但每种方法都有其优缺点。
1.1 哨兵值方法
哨兵值可以是特定于数据的约定,例如用 -9999 表示缺失的整数值,或者使用一些罕见的位模式;也可以是更通用的约定,如用 NaN(非数字)表示缺失的浮点值,NaN 是 IEEE 浮点规范的一部分。
不过,使用哨兵值也有弊端。它会减少可表示的有效值范围,并且可能需要在 CPU 和 GPU 运算中添加额外(通常未优化)的逻辑。而且,像 NaN 这样的常见特殊值并非适用于所有数据类型。
不同的语言和系统使用不同的约定来处理缺失值。例如,R 语言使用每种数据类型内的保留位模式作为哨兵值来表示缺失数据,而 SciDB 系统则为每个单元格附加一个额外的字节来表示 NA 状态。
1.2 Pandas 处理缺失值的方式
Pandas 处理缺失值的方式受到其对 NumPy 包的依赖的限制,因为 NumPy 对于非浮点数据类型没有内置的 NA 值概念。
Pandas 没有采用 R 语言为每种数据类型指定位模式来表示空值的方法,因为 NumPy 支持的基本数据类型远多于 R 语言。为所有可用的 NumPy 类型保留特定的位模式会导致在对各种类型的操作进行特殊处理时产生大量开销,甚至可能需要对 NumPy 包进行新的分支开发。此外,对于较小的数据类型(如 8 位整数),牺牲一位作为掩码会显著减少其可表示的值范围。
NumPy 支持掩码数组,即带有单独布尔掩码数组的数组,用于标记数据为“好”或“坏”。但由