【问题标题】:Select from pandas dataframe using boolean series/array使用布尔系列/数组从熊猫数据框中选择
【发布时间】:2016-05-22 00:11:05
【问题描述】:

我有一个数据框:

             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  

【问题讨论】:

    标签: python dataframe


    【解决方案1】:

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

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

    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
    

    【讨论】:

    • 所以,索引就是问题所在。谢谢!太棒了!对不起,来晚了。 :D
    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 2021-12-28
    • 2018-02-22
    • 2020-06-03
    • 1970-01-01
    • 2018-03-30
    • 2016-12-17
    • 2019-06-29
    相关资源
    最近更新 更多