Pandas:每n行累计和

2024-06-30 08:06:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,其中的“date”列的类型为dtypem8[ns],另一个是“expected_response”。然后,有一个列“cumulative_expected”,该列计算具有相同日期的行之间的预期_响应的累计和。数据帧每个月的每一秒都有一行。如下所示:

               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,然后按计数器分组。但我不知道怎么做。在

还有别的解决办法吗? 提前谢谢你


Tags: 数据代码类型dataframedfdateresponse错误
2条回答

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

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

通常解决方案是使用楼层划分创建np.arange

^{pr2}$

应通过比较^{}ed值与^{}来更改解决方案:

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

您可以使用^{}获取日期的第一个差异,以查看是否发生了更改,并将此作为引用来获取累积和。 在这里,我使用稍微修改的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

相关问题 更多 >