我有一个Pandas DataFrame,它包含有关特定对象发生故障事件的时间的信息。每行包含对象的ID,记录的开始时间(此列是完整的,格式正确的Pandas Datetime系列),该记录的持续时间(以小时为单位),某种标志以及是否为该标志对应失败。标志更一般地讲述了该行的操作条件。
我有兴趣生成某种滚动窗口,它将在DataFrame中回顾24小时,并生成新列1:告诉我们非故障相关行的总持续时间。另外,我想有一个字符串,它总结了该窗口中看到的所有标志。此操作不应位于ID组之外。但是,对于与故障相对应的行,我只需要此信息。
这些行只代表我所拥有的几十万行中的大约几百行,所以我原则上可以强制它。但我觉得有更好的方法来实现这一目标。
为了让您更好地了解我希望实现的目标,下面是生成类似DataFrame的代码:
np.random.seed(10)
df = pd.DataFrame({
'id': ['a']*5 + ['b']*5,
'start': np.array(
[np.datetime64('2017-06-01') + np.timedelta64(12,'h')*i for i in range(5)]*2
),
'duration': np.random.choice([3,4,5,6], size=(10,)),
'failed': [False,False,False,True,False,True,False,False,False,False],
'flag': np.concatenate([
np.random.choice(['1','2','3'], size=3), np.array(['8', '1', '8']),
np.random.choice(['1','2','3'], size=4)
])
})
产生这个:
duration failed flag id start
0 4 False 1 a 2017-06-01 00:00:00
1 4 False 2 a 2017-06-01 12:00:00
2 3 False 2 a 2017-06-02 00:00:00
3 6 True 8 a 2017-06-02 12:00:00
4 3 False 1 a 2017-06-03 00:00:00
5 4 True 8 b 2017-06-01 00:00:00
6 6 False 3 b 2017-06-01 12:00:00
7 3 False 1 b 2017-06-02 00:00:00
8 4 False 2 b 2017-06-02 12:00:00
9 4 False 1 b 2017-06-03 00:00:00
在这种情况下我的deisred输出看起来像:
duration failed flag id start flags total_dur
0 4 False 1 a 2017-06-01 00:00:00 None 0
1 4 False 2 a 2017-06-01 12:00:00 None 0
2 3 False 2 a 2017-06-02 00:00:00 None 0
3 6 True 8 a 2017-06-02 12:00:00 2,2 7
4 3 False 1 a 2017-06-03 00:00:00 None 0
5 4 True 8 b 2017-06-01 00:00:00 1 3
6 6 False 3 b 2017-06-01 12:00:00 None 0
7 3 False 1 b 2017-06-02 00:00:00 None 0
8 4 False 2 b 2017-06-02 12:00:00 None 0
9 4 False 1 b 2017-06-03 00:00:00 None 0