找到大熊猫系列的相同价值指数

时间:2015-09-17 00:15:35

标签: pandas

假设下面的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

这有什么问题?

1 个答案:

答案 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.valuesother.valuesselfs1others2.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