pd.array与DataFrame比较时is True返回False的原因探究
Pandas中
is True判断返回False的异常解析 问题现象
在Python 3.10.13、pandas 2.2.0搭配numpy 1.26.4的环境下,出现以下不符合直觉的比较结果:
# 此语句返回False (pd.array([""]) == pd.array([""]))[0] is True # 输出: False # 此语句正常返回True (pd.array([""]) == pd.array([""]))[0] == True # 输出: True # 直接输出该元素显示为True (pd.array([""]) == pd.array([""]))[0] # 输出: True
补充场景现象:
# StringArray场景下同样存在该问题 pd.DataFrame(dict(a=[""])).unique() # DataFrame比较中也有相同情况 (pd.DataFrame(dict(a=[""])) == pd.DataFrame(dict(a=[""]))).values[0][0] is True # 输出: False # 使用DataFrame.equals方法可正确判断值相等 pd.DataFrame(dict(a=[""])).equals(pd.DataFrame(dict(a=[""]))) is True # 输出: True
原因解析
- 类型差异是核心原因:pandas执行数组/DataFrame比较后返回的布尔元素,并非Python原生的
bool类型(即全局单例True/False),而是pandas自定义的BooleanScalar或numpy的numpy.bool_类型实例。 is与==的本质区别:is用于判断两个对象的身份(内存地址)是否完全相同,Python中True是唯一的单例对象,只有原生bool类型的True才会和它身份一致。==用于判断两个对象的值是否相等,pandas/numpy的布尔类型实现了对应的比较逻辑,会返回原生bool类型的结果,所以能正确判断值相等。
- 直接输出显示为True的原因:这些自定义布尔类型重写了
__repr__方法,打印时会显示为True,但底层对象并非Python原生的True单例。 - DataFrame.equals方法的作用:该方法是pandas专门用于判断两个DataFrame所有元素值是否完全相等的API,内部会处理类型差异,直接返回原生
bool结果,因此用is True判断有效。
内容的提问来源于stack exchange,提问作者cbo
相关产品推荐
相关产品推荐

