我有一个数据框,其列类型为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,然后对计数器进行分组。但是我不知道该怎么做。
还有其他解决方案吗? 预先谢谢你
答案 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