我正在使用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
标签:python,pandas