我正在使用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()给出的结果相同的结果。
答案 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,因为int
和None
值,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