#python #pandas
#питон #pandas
Вопрос:
У меня есть фрейм данных, где у меня есть два столбца, id
и date
.
df = pd.DataFrame([[1, '2019-05-20'], [1, '2019-05-20'], [1, '2018-04-23'], [2, '2020-01-01'], [2, '2020-01-01'], [2, '2019-12-31']], columns=['id', 'date'])
id date
1 2019-05-20
1 2019-05-20
1 2018-04-23
2 2020-01-01
2 2020-01-01
2 2019-12-31
Для каждого уникального id
я хочу выбрать все строки, которые имеют самые последние date
. Итак, мое идеальное решение должно быть следующим:
id date
1 2019-05-20
1 2019-05-20
2 2020-01-01
2 2020-01-01
Я реализовал это, сгруппировав фрейм данных по id
, а затем используя idxmax
функцию для выбора последней даты для каждого идентификатора, следующим образом:
df[df.groupby('id').date.idxmax()]
Однако это дает мне только первую строку для каждого уникального id
файла, который имеет последнюю date
версию, так что в итоге я получаю следующий результат:
id date
1 2019-05-20
2 2020-01-01
Есть ли способ, которым я могу выбрать все строки с idxmax
функцией, которые имеют наибольшее значение даты для каждой id
? Я видел в репозитории pandas github, что был ПИАР, посвященный этому вопросу(https://github.com/pandas-dev/pandas/pull/35257 ), но этот пиар был закрыт и не утвержден.
Заранее благодарю вас.
Комментарии:
1. пожалуйста, поделитесь образцами данных с ожидаемым результатом
2. @sammywemmy я добавил воспроизводимый пример, спасибо.
Ответ №1:
Вы можете использовать max
и самослияние:
df.groupby('id', as_index=False).date.max().merge(df)
Вывод:
id date
0 1 2019-05-20
1 1 2019-05-20
2 2 2020-01-01
3 2 2020-01-01
Кроме того, вы можете установить индекс с повторяющимися значениями для каждой даты, а затем использовать idxmax
:
df.index = df.groupby('date').ngroup()
df.loc[df.groupby('id').date.idxmax()]
Комментарии:
1. Спасибо. Этот ответ был очень полезным и важным…