【问题标题】:Highest value since the start of the year pandas [duplicate]自年初以来的最高价值熊猫[重复]
【发布时间】:2021-12-31 05:54:13
【问题描述】:

我有这个df

,date,id,value
0,1/1/2020,1,1
1,1/2/2020,1,10
2,1/3/2020,1,2
3,1/4/2020,1,11
4,1/5/2020,1,2
5,1/1/2021,1,1
6,1/2/2021,1,9
7,1/3/2021,1,5
8,1/4/2021,1,5
9,1/5/2021,1,5
10,1/6/2021,1,4
11,1/7/2021,1,2
12,1/8/2021,1,1
13,1/1/2020,2,20
14,1/2/2020,2,1
15,1/3/2020,2,25
16,1/4/2020,2,26
17,1/5/2020,2,1
18,1/2/2021,2,25
19,1/3/2021,2,26
20,1/4/2021,2,2
21,1/5/2021,2,3
22,1/6/2021,2,27
23,1/7/2021,2,1
24,1/8/2021,2,2

我需要得到这个df2

,date,id,value,max
0,1/1/2020,1,1,1
1,1/2/2020,1,10,10
2,1/3/2020,1,2,10
3,1/4/2020,1,11,11
4,1/5/2020,1,2,11
5,1/1/2021,1,1,1
6,1/2/2021,1,9,9
7,1/3/2021,1,5,9
8,1/4/2021,1,5,9
9,1/5/2021,1,5,9
10,1/6/2021,1,4,9
11,1/7/2021,1,2,9
12,1/8/2021,1,1,9
13,1/1/2020,2,20,20
14,1/2/2020,2,1,20
15,1/3/2020,2,25,25
16,1/4/2020,2,26,26
17,1/5/2020,2,1,26
18,1/2/2021,2,25,25
19,1/3/2021,2,26,26
20,1/4/2021,2,2,26
21,1/5/2021,2,3,26
22,1/6/2021,2,27,27
23,1/7/2021,2,1,27
24,1/8/2021,2,2,27

正如您在df2 中看到的那样,我需要自年初以来按 id 和年份分组的每一天的最大值。问题也很复杂,因为一年的第一天并不总是从 1 月 1 日开始。正如您从 df 2021 年的第一天看到的那样,id 2 从 1 月 2 日开始。任何帮助都非常重要赞赏

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    这样就够了吗:

    df['date'] = pd.to_datetime(df['date'])
    
    df.assign(max = df.groupby(df.date.dt.year).value.cummax())
    
             date  id  value  max
    0  2020-01-01   1      1    1
    1  2020-01-02   1     10   10
    2  2020-01-03   1      2   10
    3  2020-01-04   1     11   11
    4  2020-01-05   1      2   11
    5  2021-01-01   1      1    1
    6  2021-01-02   1      9    9
    7  2021-01-03   1      5    9
    8  2021-01-04   1      5    9
    9  2021-01-05   1      5    9
    10 2021-01-06   1      4    9
    11 2021-01-07   1      2    9
    12 2021-01-08   1      1    9
    13 2020-01-01   2     20   20
    14 2020-01-02   2      1   20
    15 2020-01-03   2     25   25
    16 2020-01-04   2     26   26
    17 2020-01-05   2      1   26
    18 2021-01-02   2     25   25
    19 2021-01-03   2     26   26
    20 2021-01-04   2      2   26
    21 2021-01-05   2      3   26
    22 2021-01-06   2     27   27
    23 2021-01-07   2      1   27
    24 2021-01-08   2      2   27
    

    这假定date 列按升序排序。

    【讨论】:

      【解决方案2】:

      试试cummax:

      df = pd.read_csv('data.csv', parse_dates=['date'], dayfirst=False, index_col=0)
      df
      
      df['max'] = df.groupby([pd.Grouper(freq='Y', key='date'), 'id']) \
                    .rolling(2, min_periods=1).max() \
                    .droplevel(['date', 'id']).astype(int)
      
      print(df)
      
      # Output
               date  id  value  max
      0  2020-01-01   1      1    1
      1  2020-01-02   1     10   10
      2  2020-01-03   1      2   10
      3  2020-01-04   1     11   11
      4  2020-01-05   1      2   11
      5  2021-01-01   1      1    1
      6  2021-01-02   1      9    9
      7  2021-01-03   1      5    9
      8  2021-01-04   1      5    5
      9  2021-01-05   1      5    5
      10 2021-01-06   1      4    5
      11 2021-01-07   1      2    4
      12 2021-01-08   1      1    2
      13 2020-01-01   2     20   20
      14 2020-01-02   2      1   20
      15 2020-01-03   2     25   25
      16 2020-01-04   2     26   26
      17 2020-01-05   2      1   26
      18 2021-01-02   2     25   25
      19 2021-01-03   2     26   26
      20 2021-01-04   2      2   26
      21 2021-01-05   2      3    3
      22 2021-01-06   2     27   27
      23 2021-01-07   2      1   27
      24 2021-01-08   2      2    2
      

      【讨论】:

      • 谢谢,这行得通,因为它是第一个发布的,所以选择了另一个正确的答案
      • 好的。我明白。我更新了我的答案给你一个替代方案。
      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多