У меня есть фрейм данных, в котором есть два столбца: 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, что существует PR, посвященный этому (https: // github.com/pandas-dev/pandas/pull/35257), но этот PR был закрыт и не утвержден. Заранее спасибо.

1
Usman Khaliq 4 Дек 2020 в 07:54

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()]
3
Cainã Max Couto-Silva 4 Дек 2020 в 05:15