【问题标题】:Create new pandas dataframe from an existing one only with max and min per day仅从现有数据框创建新的熊猫数据框,每天最大和最小
【发布时间】:2021-07-19 23:26:09
【问题描述】:

我有以下 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,每天只有 MAX 和 MIN, ID 表示气象站,所以我需要每天所有气象站的最小值和最大值

我找到了这个,但似乎没有做我需要的: 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=1626825600000&hmac=2phrz7iX32ed37OgFy0H9j7-lvqno_l_e2ELRW6JFio

【问题讨论】:

  • 当你说min/max时,你的意思是最高/最低的data_value吗?
  • 是的,正确....

标签: python pandas


【解决方案1】:

如果您的最小值由单个列定义,则可以使用系列 groupby:

>>> df.groupby('Date')['Data_Value'].agg(['min', 'max'])
            min  max
Date                
2005-01-01  -56  156

如果您想要完整的行或该行的其他信息,您可以使用 idxminidxmax 而不是 minmax。这里有一个额外的列,指示它是最小值还是最大值行:

>>> 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

绘图 x 轴的 Date 索引现在的范围为 1 到 365。 请注意,日期和年份数字将根据闰年移动 1:

>>> pd.Timestamp(2021, 3, 1).dayofyear
60
>>> pd.Timestamp(2020, 3, 1).dayofyear
61

如果是这样,您可能更喜欢实际日期,这里有 1 个或 2 个索引级别的 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

【讨论】:

  • 实际上我犯了一个错误,我需要每天的最大值和最小值(不是日期),所以所有气象站和不同年份的所有天的最大值和最小值(数据框有几年)
  • 请参阅编辑
猜你喜欢
  • 2017-07-25
  • 2014-06-27
  • 2014-06-04
  • 1970-01-01
  • 2021-06-02
  • 2016-07-30
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多