比较包含非

2024-09-25 04:26:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pythonshift函数来比较序列中的值是否等于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进行比较)。现在,我有一个没有任何值的序列,比如None,像这样

^{pr2}$

在这里比较两个None得到{}

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 == b.shift()给出与{}相同的结果。在


Tags: 函数importnonefalsetruepandasshiftas
3条回答

如果可以定期比较相邻条目(即最后一个条目与第一个条目进行比较),还有另一个使用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

退货:

^{pr2}$

here所示,没有人能与在熊猫/纽比中不平等的楠相提并论。在

但对于“无”,您可以使用“应用”:

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

None转换为NaN和{}具有不等于自身的属性:

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

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

如您所见:

^{pr2}$

我不确定您如何才能使其正常工作,尽管它可以:

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

{{cd2>与第一行cd2}相比较。在

要解决第一行的误报,可以将结果切片以忽略第一行:

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和{}不能用int来表示

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

相关问题 更多 >