#python #pandas
Вопрос:
У меня есть следующий df
ID Date Element Data_Value day month year
24805 USW00094889 2005-01-01 TMIN -56 1 1 2005
24863 USW00094889 2005-01-01 TMAX 44 1 1 2005
18049 USW00014853 2005-01-01 TMAX 56 1 1 2005
18066 USW00014853 2005-01-01 TMIN -39 1 1 2005
10073 USW00014833 2005-01-01 TMAX 33 1 1 2005
10079 USW00014833 2005-01-01 TMIN -44 1 1 2005
60994 USW00004848 2005-01-01 TMAX 133 1 1 2005
60995 USW00004848 2005-01-01 TMIN 0 1 1 2005
32266 USC00208202 2005-01-01 TMAX 150 1 1 2005
32274 USC00208202 2005-01-01 TMIN -50 1 1 2005
41309 USC00208080 2005-01-01 TMIN -39 1 1 2005
41334 USC00208080 2005-01-01 TMAX 33 1 1 2005
17153 USC00207320 2005-01-01 TMAX 150 1 1 2005
17155 USC00207320 2005-01-01 TMIN -11 1 1 2005
49030 USC00207312 2005-01-01 TMAX 150 1 1 2005
49074 USC00207312 2005-01-01 TMIN -39 1 1 2005
55424 USC00207308 2005-01-01 TMAX 150 1 1 2005
55428 USC00207308 2005-01-01 TMIN -44 1 1 2005
1906 USC00205822 2005-01-01 TMIN -17 1 1 2005
3058 USC00205822 2005-01-01 TMAX 128 1 1 2005
39454 USC00205563 2005-01-01 TMAX 28 1 1 2005
39468 USC00205563 2005-01-01 TMIN -28 1 1 2005
31715 USC00205451 2005-01-01 TMAX 156 1 1 2005
31718 USC00205451 2005-01-01 TMIN -44 1 1 2005
19769 USC00205450 2005-01-01 TMIN -33 1 1 2005
19772 USC00205450 2005-01-01 TMAX 128 1 1 2005
18232 USC00205050 2005-01-01 TMIN -17 1 1 2005
18261 USC00205050 2005-01-01 TMAX 56 1 1 2005
2073 USC00203712 2005-01-01 TMAX 144 1 1 2005
2812 USC00203712 2005-01-01 TMIN -50 1 1 2005
Мне нужен новый df с максимальными и МИНИМАЛЬНЫМИ значениями в день,
Идентификатор означает метеостанции, поэтому мне нужны минимальные и максимальные значения всех метеостанций в день
Я нашел это, но, похоже, не делаю того, что мне нужно: https://www.kite.com/python/answers/how-to-get-the-maximum-values-of-each-group-in-a-pandas-dataframe-in-python
РЕДАКТИРОВАТЬ: Мне нужна максимальная минута в день на всех метеостанциях за все годы в кадре данных.! Потому что позже мне нужно будет нарисовать это: https://d3c33hcgiwev3.cloudfront.net/imageAssetProxy.v1/O7lHul3pRKK5R7pd6VSiDg_d08976af1b2e66455544ff7bfba54ac7_Screen-Shot-2020-07-22-at-1.47.24-PM.png?expiry=1626825600000amp;hmac=2phrz7iX32ed37OgFy0H9j7-lvqno_l_e2ELRW6JFio
Комментарии:
1. Когда вы говорите min/max, вы имеете в виду наибольшее/наименьшее значение data_value?
2. да, правильно….
Ответ №1:
Если ваш минимум определяется одним столбцом, вы можете использовать группу рядов по:
>>> df.groupby('Date')['Data_Value'].agg(['min', 'max'])
min max
Date
2005-01-01 -56 156
Если вам нужны полные строки или другая информация из этой строки, вы можете использовать idxmin
и idxmax
вместо min
и max
. Вот он с дополнительным столбцом, указывающим, является ли это строкой минимального или максимального значения:
>>> idx = df.groupby('Date')['Data_Value'].agg(['idxmin', 'idxmax'])
>>> pd.concat({'min': df.loc[idx['idxmin']], 'max': df.loc[idx['idxmax']]}, names=['minmax']).reset_index('minmax')
minmax ID Date Element Data_Value day month year
24805 min USW00094889 2005-01-01 TMIN -56 1 1 2005
31715 max USC00205451 2005-01-01 TMAX 156 1 1 2005
Или несколько проще (без дополнительной колонки):
>>> df.loc[idx.stack()]
ID Date Element Data_Value day month year
24805 USW00094889 2005-01-01 TMIN -56 1 1 2005
31715 USC00205451 2005-01-01 TMAX 156 1 1 2005
С момента редактирования вам нужно минимальное/максимальное значение в день, в течение многих лет:
>>> df.groupby(df['Date'].dt.dayofyear)['Data_Value'].agg(['min', 'max'])
min max
Date
1 -56 156
Date
Индекс теперь будет варьироваться от 1 до 365 для вашей оси x графика.
Обратите внимание, что даты и номера дней года будут сдвинуты на 1 в зависимости от високосного года:
>>> pd.Timestamp(2021, 3, 1).dayofyear
60
>>> pd.Timestamp(2020, 3, 1).dayofyear
61
Если это так, вы можете предпочесть фактические даты, вот 2 варианта с 1 или 2 уровнями индекса:
>>> df.groupby(df['Date'].dt.strftime('%m-%d'))['Data_Value'].agg(['min', 'max'])
min max
Date
01-01 -56 156
>>> df.groupby(['month', 'day'])['Data_Value'].agg(['min', 'max'])
min max
month day
1 1 -56 156
Комментарии:
1. на самом деле я ошибся, мне нужны макс и мин в день (не дата), поэтому максимум и минимум на всех метеостанциях и во все дни разных лет (в кадре данных несколько лет)
2. пожалуйста, смотрите Правку