Python 使用Pandas按列值筛选

Python 使用Pandas按列值筛选,python,pandas,filtering,Python,Pandas,Filtering,我在pandas中有一个日期数据框,我想对其进行过滤,使“日期id”介于“开始日期”和“结束日期”之间 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 2

我在pandas中有一个日期数据框,我想对其进行过滤,使“日期id”介于“开始日期”和“结束日期”之间

     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的新用户,因此任何帮助/文档都会非常有用

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

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

取决于行数和匹配行数,因此在实际数据中进行最佳测试

#[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)
您还可以将其用作:

你可以用

要过滤,只需使用


同样在我的回答中。我想在你发布之前我正在研究解决方案!干得好
#[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)
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
df['date_id'].between(df['start_date'],df['end_date_y'])
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