【问题标题】:Pandas: cumulative sum every n rows熊猫:每n行的累积总和
【发布时间】:2018-11-28 18:23:38
【问题描述】:

我有一个数据框,其中有一列“日期”类型为 dtype M8[ns] 和另一个“expected_response”。然后,有一个列“cumulative_expected”,它对具有相同日期的行中的expected_response 进行累积总和。数据框每个月都有一行。如下:

               date Expected_response cumulative_expected
       0    2018-03-01  0.270   0.270
       1    2018-03-01  0.260   0.530
       2    2018-03-01  0.240   0.770
       3    2018-03-01  0.224   0.994
       4    2018-03-01  0.204   1.198
       5    2018-03-01  0.194   1.392
       6    2018-03-01  0.190   1.582
       ...  ...     ...     ...
2678395     2018-03-31  0.164   -7533.464
2678396     2018-03-31  0.164   -7533.300
2678397     2018-03-31  0.160   -7533.140
2678398     2018-03-31  0.154   -7532.986
2678399     2018-03-31  0.150   -7532.836

如您所见,有一个错误:累积和不识别日期的更改,并且每次日期更改时累积和都不会重新开始。

代码是:

df['cumulative_expected']=df.groupby(df['date']!=df['date'])['Expected_response'].cumsum()

也许一个选项可以是创建一个计数器,每 86400 行(一天中的秒数)增加 1,然后按计数器分组。但我不知道该怎么做。

还有其他解决办法吗? 提前谢谢你

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    有默认索引,所以可以使用楼层划分:

    df['cumulative_expected'] = df['Expected_response'].groupby(df.index // 86400).cumsum()
    

    一般的解决方案是创建np.arange 与楼层划分:

    arr = np.arange(len(df)) // 86400
    df['cumulative_expected'] = df['Expected_response'].groupby(arr).cumsum()
    

    您的解决方案应该通过将shifted 值与cumsum 进行比较来更改:

    s = (df['date']!=df['date'].shift()).cumsum()
    df['cumulative_expected'] = df['Expected_response'].groupby(s).cumsum()
    

    使用更改的样本数据进行测试:

    print (df)
    
             date  Expected_response
    0  2018-03-01              0.270
    1  2018-03-01              0.260
    2  2018-03-02              0.240
    3  2018-03-02              0.224
    4  2018-03-02              0.204
    5  2018-03-01              0.194
    6  2018-03-01              0.190
    
    s = (df['date']!=df['date'].shift()).cumsum()
    print (s)
    0    1
    1    1
    2    2
    3    2
    4    2
    5    3
    6    3
    Name: date, dtype: int32
    
    df['cumulative_expected'] = df['Expected_response'].groupby(s).cumsum()
    print (df)
            date  Expected_response  cumulative_expected
    0 2018-03-01              0.270                0.270
    1 2018-03-01              0.260                0.530
    2 2018-03-02              0.240                0.240
    3 2018-03-02              0.224                0.464
    4 2018-03-02              0.204                0.668
    5 2018-03-01              0.194                0.194
    6 2018-03-01              0.190                0.384
    

    【讨论】:

      【解决方案2】:

      您可以使用diff 获取日期的第一个差异以查看是否发生了更改,并将其用作获取累积总和的参考。 这里我使用了一个稍微修改过的df 来看看是如何工作的:

      print(df)
      
           date          Expected_response  
      0 2018-03-01              0.270                
      1 2018-03-01              0.260                
      2 2018-03-01              0.240                
      3 2018-03-01              0.224               
      4 2018-03-02              0.204                 
      5 2018-03-02              0.194                
      6 2018-03-02              0.190                
      
      df['change'] = df.date.diff().abs().fillna(0).cumsum()
      print(df)
      
          date    Expected_response   change
      0 2018-03-01              0.270 0 days
      1 2018-03-01              0.260 0 days
      2 2018-03-01              0.240 0 days
      3 2018-03-01              0.224 0 days
      4 2018-03-02              0.204 1 days
      5 2018-03-02              0.194 1 days
      6 2018-03-02              0.190 1 days
      
      df['cumulative_expected'] = df.groupby('change').cumsum()
      print(df.drop(['change'], axis = 1))
      
          date          Expected_response  cumulative_expected
      0 2018-03-01              0.270                0.270
      1 2018-03-01              0.260                0.530
      2 2018-03-01              0.240                0.770
      3 2018-03-01              0.224                0.994
      4 2018-03-02              0.204                0.204
      5 2018-03-02              0.194                0.398
      6 2018-03-02              0.190                0.588
      

      【讨论】:

        猜你喜欢
        • 2017-10-02
        • 1970-01-01
        • 2021-01-04
        • 2019-07-26
        • 2017-05-15
        • 1970-01-01
        • 2018-04-24
        • 2014-02-19
        • 1970-01-01
        相关资源
        最近更新 更多