在Python中,比较None系列

mor*_*rty 6 python pandas

我正在使用python shift函数来比较Series中的值是否等于previus值.基本上

import pandas as pd

a = pd.Series([2, 2, 4, 5])

a == a.shift()
Out[1]: 
0    False
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

这是预期的.(第一次比较是假的,因为我们正在与移位系列的"NA"进行比较).现在,我确实有系列,我没有任何价值,即."没有",就像这样

b = pd.Series([None, None, 4, 5])
Run Code Online (Sandbox Code Playgroud)

这里两个"无"的比较给出"假"

b == b.shift()
Out[3]: 
0    False
1    False
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

我愿意接受某种哲学推理,认为比较"无"是毫无意义的等等

c = None
d = None
c == d
Out[4]: True
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?!

而且,我真正想知道的是; 我怎么能对我的"b"系列进行比较,因为我希望它将"无"视为平等?那就是我想要b == b.shift()给出与== a.shift()给出的相同的结果.

EdC*_*ica 4

getNone被强制转换为NaN并且NaN具有不等于自身的属性:

[54]:
b = pd.Series([None, None, 4, 5])
b

Out[54]: 
0    NaN
1    NaN
2    4.0
3    5.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的:

In[55]:
b==b

Out[55]: 
0    False
1    False
2     True
3     True
dtype: bool
Run Code Online (Sandbox Code Playgroud)

我不确定如何让它正常工作,尽管这是有效的:

In[68]:
( (b == b.shift())  | ( (b != b.shift()) &  (b != b) ) )

Out[68]: 
0     True
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

第一行你会得到错误的结果,因为当你shift向下时,你正在与不存在的行进行比较:

In[69]:
b.shift()

Out[69]: 
0    NaN
1    NaN
2    NaN
3    4.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

因此,从布尔逻辑与第一行NaN进行比较,移位系列的第一行也是如此。TrueNaN

要解决第一行误报问题,您可以对结果结果进行切片以忽略第一行:

In[70]:
( (b == b.shift())  | ( (b != b.shift()) &  (b != b) ) )[1:]

Out[70]: 
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

至于为什么它被强制转换,Pandas试图将数据强制转换为兼容的numpy,这里选择float是因为ints和Nonevalues,None并且NaN不能用ints表示

a要获得与示例中相同的结果,您应该将第一行覆盖为False,因为它总是会失败:

In[78]:
result = pd.Series( ( (b == b.shift())  | ( (b != b.shift()) &  (b != b) ) ) )
result.iloc[0] = False
result

Out[78]: 
0    False
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)