首页 > 解决方案 > Groupby 连续值和聚合

问题描述

这是我的数据集(熊猫 DataFrame df):

DateTime              INDICATOR
2017-01-01 10:35:00   0
2017-01-01 10:40:00   0
2017-01-01 10:45:00   0
2017-01-01 10:50:00   0
2017-01-01 10:55:00   0
2017-01-01 11:00:00   0
2017-01-01 11:05:00   1
2017-01-01 11:10:00   1
2017-01-01 11:15:00   1
2017-01-01 11:20:00   1
2017-01-01 11:25:00   0
2017-01-01 11:30:00   0
2017-01-01 11:35:00   1
2017-01-01 11:40:00   1
2017-01-01 11:45:00   1

该列DateTime的类型为datetime64[ns]

我想获得INDICATOR等于 1 的数据段的持续时间(以分钟为单位)。

预期结果是:

[15, 10]

这就是我尝试解决此任务的方式,但我收到所有 0 值:

s=df["INDICATOR"].eq(1)
df1=df[s].copy()
s1=df1.groupby(s.cumsum())["DateTime"].transform(lambda x : x.max()-x.min()).dt.seconds

的所有值s1都是 0。

标签: pythonpandas

解决方案


首先,使用以下命令创建 groupID:

gb_ID = df.INDICATOR.diff().ne(0).cumsum()

接下来,仅选择INDICATOR == 1并按groupbygb_ID查找max,每个 gb_ID minDateTime找到diff这个maxmin。最后,选择不NaT将其转换为 int of minutes 的列并调用values返回数组。

df.query('INDICATOR == 1').groupby(gb_ID)['DateTime'].agg(['min', 'max']) \
                          .diff(axis=1)['max'].dt.seconds.floordiv(60).values

Out[351]: array([15, 10], dtype=int64)

以下是选择非NaT和之前的数据框values

df.query('INDICATOR == 1').groupby(gb_ID)['DateTime'].agg(['min', 'max']).diff(axis=1)

Out[362]:
          min      max
INDICATOR
2         NaT 00:15:00
4         NaT 00:10:00

推荐阅读