Фильтрация по значениям столбцов с использованием панд - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть фрейм данных с датами в пандах, и я хочу отфильтровать его так, чтобы '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')]

Приведенный выше код приводит к ошибке ключа.Я новый пользователь панд, поэтому любая помощь / документация была бы невероятно полезной.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Вы также можете использовать 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
0 голосов
/ 20 сентября 2018

Вы можете использовать между !

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
0 голосов
/ 20 сентября 2018

Мне кажется, нужно изменить имя столбца на 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...