假设下面的pandas系列具有相同的值索引B,C。
from pandas import Series
s1 = Series({'A':90, 'B': 95, 'C':85})
s2 = Series({'C':85, 'D':50, 'B': 95})
为了找到相同的价值指数,我在下面做了但却失败了。
>>> s1==s2
A False
B False
C False
dtype: bool
这有什么问题?
答案 0 :(得分:1)
如果您运行此脚本,您将被放入s1 == s2
之前的pdb调试器中:
import pandas as pd
s1 = pd.Series({'A':90, 'B': 95, 'C':85})
s2 = pd.Series({'C':85, 'D':50, 'B': 95})
import pdb
pdb.set_trace()
s1 == s2
如果您单步执行the code,则会很快到达
if isinstance(other, pd.Series):
name = _maybe_match_name(self, other)
if len(self) != len(other):
raise ValueError('Series lengths must match to compare')
return self._constructor(na_op(self.values, other.values),
index=self.index, name=name)
请注意na_op
,即进行相等比较的函数,需要self.values
和other.values
。 self
为s1
,other
为s2
。 .values
属性返回NumPy数组:
In [49]: s1.values
Out[49]: array([90, 95, 85])
In [50]: s2.values
Out[50]: array([95, 85, 50])
因此,根据定义,Pandas执行两个Series 的相等比较的方式会忽略索引。
如果要执行基于索引对齐值的数字相等性检查,可以使用
In [48]: s1-s2 == 0
Out[48]:
A False
B True
C True
D False
dtype: bool
更一般地说,如果值不是数字,则可以使用pd.concat
将Series连接到DataFrame。这使得两个系列基于索引对齐:
s1 = pd.Series({'A':'foo', 'B': 'bar', 'C':'baz'})
s2 = pd.Series({'C':'baz', 'D':'quux', 'B': 'bar'})
df = pd.concat([s1, s2], axis=1)
# 0 1
# A foo NaN
# B bar bar
# C baz baz
# D NaN quux
索引对齐后,您可以将值与==
进行比较:
In [20]: df[0] == df[1]
Out[20]:
A False
B True
C True
D False
dtype: bool