Pandas DataFrame中None与NaN显示不同?二者是否可互换?
Pandas中None与NaN显示差异但equals返回True的原因及互换性解析
代码示例
import pandas as pd import io df1 = pd.DataFrame({'a':[None]}) s = df1.to_json(orient='table') df2 = pd.read_json(io.StringIO(s), orient='table')
df1输出:
a 0 None
df2输出:
a 0 NaN
显示差异的原因
直接创建的df1里,None属于Python对象,此时列a的数据类型是object,Pandas会直接显示None;而通过JSON序列化再读取的过程中,JSON本身没有None的概念,会把缺失值序列化为NaN,读取后Pandas将其识别为浮点型缺失值,列a的数据类型变为float64,所以显示为NaN。
为何df1.equals(df2)返回True
Pandas的equals()方法在比较DataFrame时,会把None和NaN统一视为缺失值,只要对应位置都是缺失状态,就判定为相等,不会纠结显示的符号差异。
None与NaN在Pandas中的互换性
两者在多数缺失值处理场景下可以互换,但并非完全等价:
- 当列是
object类型时,None和NaN都代表缺失值,但None是Python对象,NaN是浮点型; - 若列是数值类型(如
int、float),None会被自动转为NaN,因为数值类型无法存储Python对象; - 使用
isnull()、notnull()等函数时,两者都会被识别为缺失值; - 但用
==直接比较单个值时(比如df1['a'][0] == df2['a'][0])会返回False,因为Python中None == NaN本身就是False,这种场景下两者有区别。
内容的提问来源于stack exchange,提问作者user607722
相关产品推荐
相关产品推荐

