如何比较两行两只熊猫系列?

时间:2016-10-08 04:39:42

标签: python pandas

我有两个python pandas系列df10df5。我想比较它们的值。例如:df10[-1:]< df5[-1:],它返回true。 df10[-2:-1] > df5[-2:-1],它返回false。

但如果我将它们组合在一起df10[-1:]< df5[-1:] and df10[-2:-1]>df5[-2:-1],它会返回

  

系列的真值是模棱两可的。使用a.empty,a.bool(),   a.item(),a.any()或a.all()

但我希望它返回false。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

考虑一下这个程序中有两个数据帧:

# Python 3.5.2
import pandas as pd
import numpy as np

# column names for example  dataframe
cats = ['A', 'B', 'C', 'D', 'E']

df5 = pd.DataFrame(data = np.arange(25).reshape(5, 5), columns=cats)
print("Dataframe 5\n",df5,"\n")

df10=pd.DataFrame(data = np.transpose(np.arange(25).reshape(5, 5)), columns=cats)
print("Dataframe 10\n",df10)

结果数据框为:

Dataframe 5
     A   B   C   D   E
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19
4  20  21  22  23  24 

Dataframe 10
    A  B   C   D   E
0  0  5  10  15  20
1  1  6  11  16  21
2  2  7  12  17  22
3  3  8  13  18  23
4  4  9  14  19  24

现在让我们看看你第一次比较的结果:

print(df5[-1:])
print(df10[-1:])

a=df10[-1:]< df5[-1:]

print("\n",a,"\n",type(a))

导致:

    A   B   C   D   E
4  20  21  22  23  24
   A  B   C   D   E
4  4  9  14  19  24

       A     B     C     D      E
4  True  True  True  True  False 
 <class 'pandas.core.frame.DataFrame'>

现在进行第二次比较:

print(df5[-2:-1])
print(df10[-2:-1])

b=df10[-2:-1]>df5[-2:-1]
print("\n",b,"\n",type(b))

有结果:

    A   B   C   D   E
3  15  16  17  18  19
   A  B   C   D   E
3  3  8  13  18  23

        A      B      C      D     E
3  False  False  False  False  True 
 <class 'pandas.core.frame.DataFrame'>

问题:

如果我们评估:

pd.Series([True, True, False, False]) and pd.Series([False, True, False, True])

答案是什么?:

  1. pd.Series([False, True, False, False])
  2. False
  3. True
  4. 以上所有
  5. 以上任何
  6. 取决于
  7. 答案是:6 - 这取决于。这取决于你想要什么。

    首先,我们必须为比较创建布尔系列:

    a_new = (df10[-1:] < df5[-1:]).any()
    print(a_new,"\n",type(a_new))
    
    b_new = (df10[-2:-1] > df5[-2:-1]).any()
    print("\n",b_new,"\n",type(b_new))
    

    结果是:

    A     True
    B     True
    C     True
    D     True
    E    False
    dtype: bool 
     <class 'pandas.core.series.Series'>
    
    A    False
    B    False
    C    False
    D    False
    E     True
    dtype: bool 
     <class 'pandas.core.series.Series'>
    

    现在,我们可以计算3个案例。

    案例1:a.any()和b.any()

    a.any() = True if any item in a is True
    b.any() = True if any item in b is True
    print(a_new.any() and b_new.any())
    

    结果是 True。

    案例2:a.all()和b.all()

    a.all() = True if every item in a is True   
    b.all() = True if every item in b is True
    print(a_new.all() and b_new.all())
    

    结果是错误。

    案例3:成对比较

    为此,您必须将每个元素相互比较。

    result_pairwise = [a_new and b_new for a_new, b_new in zip(a_new,b_new)]
    print(result_pairwise,"\n",type(result_pairwise))
    

    结果是:

    [False, False, False, False, False] 
     <class 'list'>
    

    有关详细信息,请参阅Pandas GotchasBoolean Reductions.

答案 1 :(得分:0)

您可以使用pandas Series values属性执行此操作:

if (df10.values[-2:-1] > df5.values[-2:-1]) and\ 
        (df10.values[-1:] < df5.values[-1:]):
    print("we met the conditions!")