使用布尔系列/数组从pandas数据框中选择

时间:2016-05-21 12:34:59

标签: python dataframe

我有一个数据框:

             High    Low  Close
Date                           
2009-02-11  30.20  29.41  29.87
2009-02-12  30.28  29.32  30.24
2009-02-13  30.45  29.96  30.10
2009-02-17  29.35  28.74  28.90
2009-02-18  29.35  28.56  28.92

和一个布尔系列:

     bools
1    True
2    False
3    False
4    True
5    False

如何使用布尔数组从数据框中选择以获得如下结果:

             High   
Date                           
2009-02-11  30.20  
2009-02-17  29.35  

1 个答案:

答案 0 :(得分:22)

对于使用两个DataFrame的索引,它们必须具有可比较的索引。在这种情况下,它不会起作用,因为一个DataFrame具有整数索引,而另一个具有日期。

但是,正如您所说可以使用bool 数组进行过滤。您可以通过Series访问.values的数组。然后可以将其应用为过滤器,如下所示:

df # pandas.DataFrame
s  # pandas.Series 

df[s.values] # df, filtered by the bool array in s

例如,您的数据:

import pandas as pd

df = pd.DataFrame([
            [30.20,  29.41,  29.87],
            [30.28,  29.32,  30.24],
            [30.45,  29.96,  30.10],
            [29.35,  28.74,  28.90],
            [29.35,  28.56,  28.92],
        ],
        columns=['High','Low','Close'], 
        index=['2009-02-11','2009-02-12','2009-02-13','2009-02-17','2009-02-18']
        )

s = pd.Series([True, False, False, True, False], name='bools')

df[s.values]

返回以下内容:

            High    Low     Close
2009-02-11  30.20   29.41   29.87
2009-02-17  29.35   28.74   28.90

如果您只想要高列,则可以正常过滤(在bool过滤器之前或之后):

df['High'][s.values]
# Or: df[s.values]['High']

获取目标输出(作为Series):

 2009-02-11    30.20
 2009-02-17    29.35
 Name: High, dtype: float64