按连续值分组并汇总

时间:2019-06-09 20:15:20

标签: python pandas

这是我的数据集(pandas 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。

2 个答案:

答案 0 :(得分:3)

首先,使用以下方法创建groupID:

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

接下来,仅选择INDICATOR == 1,然后按groupby进行gb_ID。在每个gb_ID中找到{{1}中的maxmin。在DateTimediff中找到max。最后,选择非min的列以将其转换为分钟数,然后调用NaT返回数组。

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

答案 1 :(得分:0)

考虑到this post,我正在考虑使用np.split()将数据帧分成子帧。

尝试一下:

from numpy import nan

# split df on condition that indicator is 0
splitted_dfs = np.split(df, *np.where(df. INDICATOR == 0))

results = []

for split in splitted_dfs:
    # iloc[1:] omits the first 0 entry of the splitted df
    results.append(split.iloc[1:].index.max() - split.iloc[1:].index.min())

print([int(x.seconds / 60) for x in results if x.seconds is not nan])

# prints to [15, 10]

说明

具有条件np.split()

INDICATOR == 0在满足条件的每一行进行拆分。这将产生以下数据帧列表:

2017-01-01 10:35:00          0, INDICATOR

2017-01-01 10:40:00          0, INDICATOR

2017-01-01 10:45:00          0, INDICATOR

2017-01-01 10:50:00          0, INDICATOR

2017-01-01 10:55:00          0, INDICATOR

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, INDICATOR

2017-01-01 11:25:00          0, INDICATOR

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

您可以遍历该列表,忽略空列表并删除相关列表的前0个条目。