按日期分组计算DataFrame的Expanding Sum累计求和
没问题,你只需要先按日期对数据分组,再在每个分组内单独应用累计求和逻辑,就能实现每日内的累计效果啦!具体操作如下:
步骤1:处理日期列,提取分组依据
首先要确保creationDateTime是datetime类型,然后从中提取纯日期部分作为分组的键:
import pandas as pd # 先转换为datetime类型(如果还没转的话) data_aggregated['creationDateTime'] = pd.to_datetime(data_aggregated['creationDateTime']) # 添加纯日期列,用于分组 data_aggregated['date'] = data_aggregated['creationDateTime'].dt.date
步骤2:分组后应用累计求和
按提取出的date列分组,然后对每个分组的OK和Fail列分别计算累计求和:
# 对每个日期组内的OK列做累计求和 data_aggregated['RollingOK'] = data_aggregated.groupby('date')['OK'].expanding().sum().reset_index(level=0, drop=True) # 对每个日期组内的Fail列做累计求和 data_aggregated['RollingFail'] = data_aggregated.groupby('date')['Fail'].expanding().sum().reset_index(level=0, drop=True)
这里的reset_index(level=0, drop=True)是为了把分组后的索引还原,让计算结果能和原DataFrame的行一一对应上。
验证结果
运行完上面的代码后,你会得到和期望完全一致的结果:
creationDateTime OK Fail RollingOK RollingFail
2017-01-06 21:30:00 4 0 4 0
2017-01-06 21:35:00 4 0 8 0
2017-01-06 21:36:00 4 0 12 0
2017-01-07 21:48:00 3 1 3 1
2017-01-07 21:53:00 4 0 7 1
2017-01-08 21:22:00 3 1 3 1
2017-01-08 21:27:00 3 1 6 2
2017-01-09 21:49:00 3 1 3 1
补充说明:为什么原来的代码不符合需求?
你之前写的data_aggregated['OK'].expanding(0).sum()是对整个DataFrame的所有行做全局累计求和,会从第一行一直累加到最后一行;而我们需要的是每个日期组内部单独累计,所以必须先通过groupby按日期分组,再对每个分组应用expanding().sum()。
内容的提问来源于stack exchange,提问作者Radu Gheorghiu

