Отфильтруйте пандас датафрейм по дате из другого фрейма данных - PullRequest
0 голосов
/ 25 мая 2018

Предположим, у меня есть следующие две таблицы.Обратите внимание, что вторая таблица расширяется еще на 15 дней до февраля:

dates1 = pd.DataFrame(data=pd.date_range('2018-1-1 00:00', '2018-1-31 23:59', freq='h'), columns=['date'])
dates2 = pd.DataFrame(data=pd.date_range('2018-1-1 00:00', '2018-2-15 23:59', freq='h'), columns=['date'])

Я хочу отфильтровать второй кадр данных на основе самой последней даты из первого кадра данных.Здесь я нахожу самую последнюю дату из таблицы дат1.В результате получается отметка времени:

most_recent_dates1 = dates1['date'].max()
Timestamp('2018-01-31 23:00:00')

Затем я пытаюсь отфильтровать вторую таблицу следующим образом:

dates3 = dates2[[dates2['date'] <= most_recent_dates1]]

Но я получаю следующую ошибку:

ValueError: Item wrong length 1 instead of 1104.

Как я могу отфильтровать таблицу, используя одну временную метку из другой таблицы, и не получить эту ошибку?Я знаю, что могу сделать это с помощью внутреннего соединения (pandas.merge), но иногда я не хочу использовать внутреннее соединение.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

вы можете попробовать то же самое, используя функцию применения

dates2[dates2.apply(lambda x: x['date'] <= most_recent_dates1,axis=1)]
0 голосов
/ 25 мая 2018

Индексация кадров данных Pandas допускает логический ряд / массив в качестве входных данных.Следовательно, вам не нужно использовать список серии.Вы можете индексировать напрямую с помощью логической серии:

dates3 = dates2[dates2['date'] <= most_recent_dates1]

Как указывает ошибка, вы указали элемент длины 1, тогда как он ожидает элемент такой же длины, что и ваш фрейм данных.

См. Булево индексирование из официальных документов для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...