Мне кажется, нужно изменить имя столбца на 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)