Pandas列转category类型后NaN值逻辑判断结果不一致问题
问题原因
这个差异是pandas 1.1.x及更早版本中,Categorical类型和object类型的向量比较逻辑不一致导致的,核心逻辑如下:
- 单元素比较的逻辑始终统一:取出的单个NaN值不管属于什么类型的列,
np.nan != 'Finance'都会返回True,这符合NaN本身的定义(NaN不等于任何非NaN值,也不等于自身) - 转换前Team列是object类型:pandas对object类型列做向量比较时,会遵循单元素的比较规则,将NaN和非NaN值的不等判断结果返回为True,所以得到
[True, True, False]的结果 - 转换为category类型后:pandas 1.1.3版本的Categorical向量比较采用了特殊的三值逻辑处理,缺失的分类值和任意标量做
==、!=比较时,结果都会被映射为False,因此第二个元素的NaN比较后返回False,最终得到[True, False, False]的结果
解决方案
这个行为差异在pandas 1.2.0版本已经被正式修复,升级pandas版本即可让Categorical的比较逻辑和object类型保持一致。如果需要在1.1.3版本中规避该问题,可以显式兼容缺失值:
# 等价于正确的不等判断,同时兼容NaN (employees['Team'] != 'Finance') | employees['Team'].isna()
内容的提问来源于stack exchange,提问作者Bazman
相关产品推荐
相关产品推荐

