我正在使用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()给出的相同的结果.
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)