仅根据条件为Pandas中的特定行生成滚动视图

时间:2017-11-17 19:13:54

标签: python python-3.x pandas

我有一个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

0 个答案:

没有答案