python None == None 是真还是假?

use*_*057 -3 python null pandas

条件None == None是真还是假?

我有 2 个熊猫数据框:

import pandas as pd

df1 = pd.DataFrame({'id':[1,2,3,4,5], 'value':[None,20,None,40,50]})
df2 = pd.DataFrame({'index':[1,2,3], 'value':[None,20,None]})

In [42]: df1

Out[42]:    id  value
         0   1    NaN
         1   2   20.0
         2   3    NaN
         3   4   40.0
         4   5   50.0

In [43]: df2

Out[43]:    index  value
         0      1    NaN
         1      2   20.0
         2      3    NaN
Run Code Online (Sandbox Code Playgroud)

当我执行合并操作时,它看起来None == None是 True:

In [37]: df3 = df1.merge(df2, on='value', how='inner')
In [38]: df3
Out[38]:    id  value  index
         0   1    NaN      1
         1   1    NaN      3
         2   3    NaN      1
         3   3    NaN      3
         4   2   20.0      2
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

In [39]: df4 = df3[df3['value']==df3['value']]
In [40]: df4
Out[40]:    id  value  index
         4   2   20.0      2         

In [41]: df3['value']==df3['value']
Out[41]: 0    False
         1    False
         2    False
         3    False
         4     True 
Run Code Online (Sandbox Code Playgroud)

它表明这None == None是错误的。

Mar*_*ers 5

Pandas 使用浮点Not a Number,NaN来表示一系列数字中缺少某些内容。这是因为在数据的内部表示中更容易处理。您None的系列中没有任何对象。即便如此,如果使用dtype=object数据,None则用于对缺失值进行编码。请参阅处理缺失数据

在这里并不重要,但 NaN 根据定义始终不等于 NaN:

>>> float('NaN') == float('NaN')
False
Run Code Online (Sandbox Code Playgroud)

在合并或广播时,Pandas 知道“缺失”是什么意思,没有对 NaN 或None系列中的值进行相等测试。显式跳过空值。

如果要测试值是否为空,请改用series.isnull()series.notnull()方法。