熊猫:每n行累积总和

时间:2018-11-28 09:34:18

标签: python pandas

我有一个数据框,其列类型为dtype M8 [ns]的“日期”和另一个“期望响应”。然后,存在一列“ 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,然后对计数器进行分组。但是我不知道该怎么做。

还有其他解决方案吗? 预先谢谢你

2 个答案:

答案 0 :(得分:3)

有默认索引,因此您可以使用楼层划分:

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

您应该通过将shift的值与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

答案 1 :(得分: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