Сохранение повторяющихся значений с idxmax в Pandas

#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. Спасибо. Этот ответ был очень полезным и важным…