我有一个数据集:
df = pd.DataFrame({
'service': ['a', 'a', 'a', 'b', 'c', 'a', 'a'],
'status': ['problem', 'problem', 'ok', 'problem', 'ok', 'problem', 'ok'],
'created': [
datetime(2019, 1, 1, 1, 1, 0),
datetime(2019, 1, 1, 1, 1, 10),
datetime(2019, 1, 1, 1, 2, 0),
datetime(2019, 1, 1, 1, 3, 0),
datetime(2019, 1, 1, 1, 5, 0),
datetime(2019, 1, 1, 1, 10, 0),
datetime(2019, 1, 1, 1, 20, 0),
],
})
print(df.head(10))
service status created
0 a problem 2019-01-01 01:01:00 # -\
1 a problem 2019-01-01 01:01:10 # --> one group
2 a ok 2019-01-01 01:02:00 # -/
3 b problem 2019-01-01 01:03:00
4 c ok 2019-01-01 01:05:00
5 a problem 2019-01-01 01:10:00 # -\
6 a ok 2019-01-01 01:20:00 # - --> one group
您会看到a
服务更改状态problem
-> ok
(0、2个项目; 5、6个项目)。您还可以看到3
,4
项目没有更改(只有1条记录-没有组/块)。我需要创建下一个数据集:
service downtime_seconds
0 a 60 # `created` difference between 2 and 0
1 a 600 # `created` difference between 6 and 5
我可以通过iteration
做到这一点:
for i in range(len(df.index)):
# if df.loc[i]['status'] blablabla...
是否可以使用pandas
而不使用iteration
?也许有一种更优雅的方法?
谢谢。
答案 0 :(得分:3)
在您的情况下,我们需要通过颠倒顺序和groupby
来创建cumsum
键,然后只需要在分组之前过滤df,将nunique
与{{1}一起使用}
transform