#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». Это означает, что я получаю другой кадр данных в качестве вывода вашей замечательной команды. Как я могу работать только с выбранным столбцом?