Создавайте новый фрейм данных pandas из существующего только с максимальным и минимальным значением в день

#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. пожалуйста, смотрите Правку