gpt4 book ai didi

python - Pandas 按 block 分组

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:54 25 4
gpt4 key购买 nike

我有一个数据集:

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 项)。您还可以看到 34 项目没有变化(只有 1 条记录 - 没有组/ block )。我需要创建下一个数据集:

  service  downtime_seconds
0 a 60 # `created` difference between 2 and 0
1 a 600 # `created` difference between 6 and 5

我可以通过迭代来完成:

for i in range(len(df.index)):
# if df.loc[i]['status'] blablabla...

是否可以使用 pandas 而无需 iteration?也许有更优雅的方法?

谢谢。

最佳答案

在您的情况下,我们需要通过颠倒顺序和 cumsum 创建 groupby 键,然后我们只需要在 groupby 之前过滤 df,使用 nunique transform

s=df.status.eq('ok').iloc[::-1].cumsum()
con=df.service.groupby(s).transform('nunique')==1
df_g=df[con].groupby(s).agg({'service':'first','created':lambda x : (x.iloc[-1]-x.iloc[0]).seconds})
Out[124]:
service created
status
1 a 600
3 a 60

关于python - Pandas 按 block 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59092008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com