Найдите максимальное значение по году и дате возврата, на которую произошло максимальное значение в Панд с датами в качестве индекса

#python #pandas #dataframe #datetime #indexing

Вопрос:

У меня есть этот фрейм данных

 date,AA 1980-01-01, 77.7 1980-01-02, 86 1980-01-03, 92.3 1980-01-04, 96.4 1980-01-05, 85.7 1980-01-06, 75.7 1980-01-07, 86.8 1980-01-08, 93.2 1985-08-13, 224.6 1985-08-14, 213.9 1985-08-15, 205.7 1985-08-16, 207.3 1985-08-17, 202.1  

Я хотел бы вычислить максимальное значение для каждого года и дату, когда это произойдет. Я борюсь, потому что я действительно хотел бы сохранить дату в качестве индекса.

Действительно, я прочитал это как:

 dfr = pd.read_csv(fnamed, sep=',', header = 0, index_col=0, parse_dates=True)  

Я знаю, что я мог бы повторить пример, как

 dfr_D = dfr.resample('Y').max()  

но в этом случае я бы потерял информацию о местоположении максимального значения в течение года.

Я нашел это:

 idx = dfr.groupby(lambda x: dfr['date'][x].year)["A"].idxmax()  

Однако dfr [«дата»], похоже, является именем столбца, в то время как в моем случае дата в индексе и». год » не являются одним из его свойств.

У меня есть идея, что я должен работать с «groupby» и «indexmax». Однако все посещения, которые я делал, все они провалились.

Заранее спасибо

Ответ №1:

Предполагая, что «дата» имеет тип даты-времени и столбец, вы можете использовать следующее, чтобы срезать данные с максимальным значением для каждой группы:

 df.loc[df.groupby(df['date'].dt.year)['AA'].idxmax().values]  

выход:

 date AA 3 1980-01-04 96.4 8 1985-08-13 224.6  

Если «дата» — это индекс:

 df.loc[df.groupby(df.index.year)['AA'].idxmax().values]  

выход:

 AA date  1980-01-04 96.4 1985-08-13 224.6  

Комментарии:

1. Идеальный. Очень элегантно. В моем реальном случае у меня есть две колонки «AA», «BB». Это означает, что я получаю другой кадр данных в качестве вывода вашей замечательной команды. Как я могу работать только с выбранным столбцом?