微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中,比较None系列

我正在使用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])

这里两个“无”的比较给出“假”

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”系列进行比较,因为我希望它将“无”视为平等?那就是我想要b == b.shift()给出与== a.shift()给出的相同的结果.

解决方法:

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

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

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,这里选择了float因为int和None值,None和NaN不能用int表示

要获得与示例中相同的结果,您应该将第一行覆盖为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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐