python - 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。
解决方案
首先,使用以下命令创建 groupID:
gb_ID = df.INDICATOR.diff().ne(0).cumsum()
接下来,仅选择INDICATOR == 1
并按groupby
。gb_ID
查找max
,每个 gb_ID min
。DateTime
找到diff
这个max
,min
。最后,选择不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
推荐阅读
- kubernetes - How to convert YAML to JSON when saving files into container using Kubernetes Configmap
- vb.net - Wcf how to verify the caller identity?
- php - PHP - 单击时如何将数据库中的值传递到另一个页面
- c++ - 我可以在 Qt 中使用 QUdpSockets wo 轮询或自定义类吗?
- javascript - How to fix jquery .is(':focus') not responding
- asp.net - How can I view IBM Watson Assistant conversation logs in my ASP.net application?
- javascript - 从外部的 axios 返回响应值
- java - 是否有一种方法可以在线程之间进行通信并交换信息,例如在 java 中的可运行对象中的 getter 方法
- python - 如何在不替换其他字母的情况下替换某个字母?
- php - 如何在 PHPSpreadsheet 中获取命名范围