【问题标题】:pandas group by chunks大熊猫按块分组
【发布时间】:2020-03-24 07:07:29
【问题描述】:

我有一个数据集:

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 条记录 - 没有组/块)。我需要创建下一个数据集:

  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?也许有更优雅的方法?

谢谢。

【问题讨论】:

    标签: python pandas dataset


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2021-12-23
      • 1970-01-01
      • 2017-12-30
      • 2020-10-27
      • 1970-01-01
      相关资源
      最近更新 更多