【问题标题】:Filtering by column values using Pandas使用 Pandas 按列值过滤
【发布时间】:2019-02-24 19:29:09
【问题描述】:

我在 pandas 中有一个日期数据框,我想对其进行过滤,使“date_id”介于“start_date”和“end_date”之间

     date_id    start_date  end_date
0   2010-06-04  2008-08-01  2008-09-26
1   2010-06-04  2008-08-01  2008-09-26
2   2010-06-04  2008-08-01  2008-09-26
3   2010-06-04  2008-08-26  2008-10-26
4   2010-06-04  2010-05-01  2010-09-26
5   2010-06-04  2008-08-01  2008-09-26
6   2010-06-04  2008-08-01  2008-09-26
7   2010-09-04  2010-08-01  2010-09-26

我试过使用下面的代码:

df[(df['date_id'] >= df['start_date'] & df['date_id']<= df['end_date')]

上面的代码导致一个关键错误。我是 pandas 的新用户,所以任何帮助/文档都会非常有帮助。

【问题讨论】:

    标签: python pandas filtering


    【解决方案1】:

    我认为需要将列名更改为 end_date_y 并添加 () 因为运算符优先级:

    df1 = df[(df['date_id'] >= df['start_date']) & (df['date_id']<= df['end_date_y'])]
    

    或者使用between:

    df1 = df[df['date_id'].between(df['start_date'], df['end_date_y'])]
    print (df1)
         date_id start_date end_date_y
    4 2010-06-04 2010-05-01 2010-09-26
    7 2010-09-04 2010-08-01 2010-09-26
    

    性能

    取决于行数和匹配行数,所以最好在真实数据中测试。

    #[80000 rows x 3 columns]
    df = pd.concat([df] * 10000, ignore_index=True)
    #print (df)
    
    In [236]: %timeit df[df['date_id'].between(df['start_date'], df['end_date_y'])]
    2.44 ms ± 92.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [237]: %timeit df[(df['date_id'] >= df['start_date']) & (df['date_id']<= df['end_date_y'])]
    2.42 ms ± 193 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [238]: %timeit df.query("start_date <= date_id <=  end_date_y")
    4.45 ms ± 14.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

      【解决方案2】:

      您也可以将query 用作:

      df.query("start_date <= date_id <=  end_date_y")
      
          date_id     start_date  end_date_y
      4   2010-06-04  2010-05-01  2010-09-26
      7   2010-09-04  2010-08-01  2010-09-26
      

      【讨论】:

        【解决方案3】:

        你可以使用between

        df['date_id'].between(df['start_date'],df['end_date_y'])
        

        要过滤,只需使用.loc

        df.loc[df['date_id'].between(df['start_date'],df['end_date_y'])]
        
        
             date_id start_date end_date_y
        4 2010-06-04 2010-05-01 2010-09-26
        7 2010-09-04 2010-08-01 2010-09-26
        

        【讨论】:

        • 也在我的回答中。
        • 我猜在你发布之前我正在研究解决方案!干得好
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 2022-06-20
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多