在Python中,比较None系列

时间:2017-08-17 14:20:41

标签: 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

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

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

这里比较两个"无" s给出" False"

b == b.shift()
Out[3]: 
0    False
1    False
2    False
3    False
dtype: bool

我愿意接受某种哲学推理,认为比较"无"然而,没有意义等等。

c = None
d = None
c == d
Out[4]: True

这是怎么回事?!

而且,我真正想知道的是;我怎样才能对我的" b" -Series进行比较,因为我希望它能够治疗"没有"是平等的?那就是我想要b == b.shift()给出与== a.shift()给出的结果相同的结果。

3 个答案:

答案 0 :(得分:3)

None获取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

正如你在这里看到的那样:

In[55]:
b==b

Out[55]: 
0    False
1    False
2     True
3     True
dtype: bool

我不知道你怎么能让它正常工作,虽然这有效:

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

Out[68]: 
0     True
1     True
2    False
3    False
dtype: bool

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

In[69]:
b.shift()

Out[69]: 
0    NaN
1    NaN
2    NaN
3    4.0
dtype: float64

所以NaN正在比较布尔逻辑中的True,因为第一行是NaN,移位系列的第一行也是如此。

要解决第一行False-positive,您可以将结果结果切片以忽略第一行:

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

Out[70]: 
1     True
2    False
3    False
dtype: bool

至于为什么它被转换,Pandas尝试将数据强制转换为兼容的numpy,因为intNone值,None选择了float。 }和NaN无法由int s

表示

要在示例中获得与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

答案 1 :(得分:1)

如果您可以定期比较相邻的条目(即,最后一个条目与第一个条目进行比较),那么使用numpy roll函数还有另一个简单的解决方案:

import numpy as np

b = [None, None, 4, 5] 
# or list(b) if b is a pandas Series

np.roll(b,1) == b

返回:

> array([False,  True, False, False])

答案 2 :(得分:0)

here所示,“无”与在熊猫/ numpy中不相等的nan相比较。

但是对于None,您可以使用apply轻松地完成一个不错的工作:

In[1]:
foo = pd.Series([None, 'a'])
foo==None

Out[1]:
0    False
1    False
dtype: bool 


In[2]:
foo.apply(lambda a:a==None)
Out[2]: 
0     True
1    False
dtype: bool