python - 根据分组获取连续出现
问题描述
我正在尝试找到一种方法来获取按主机分组并按时间排序的连续事件组。理想情况下,我需要满足一定门槛的群体,并且isCorrect == false
例子
Time | Host | isCorrect |
-------------------------------------
10:01 | HostA | true |
10:02 | HostB | true |
10:03 | HostA | false |
10:15 | HostA | false |
10:16 | HostA | false |
10:18 | HostB | false |
10:20 | HostA | true |
10:21 | HostA | true |
10:22 | HostB | false |
10:23 | HostB | false |
阈值:>=3
将导致 2 组
Time | Host | isCorrect | Group
--------------------------------------------
10:03 | HostA | false |1
10:15 | HostA | false |1
10:16 | HostA | false |1
10:18 | HostB | false |2
10:22 | HostB | false |2
10:23 | HostB | false |2
我正在阅读https://towardsdatascience.com/pandas-dataframe-group-by-consecutive-certain-values-a6ed8e5d8cc但找不到先按主机分组的方法。
解决方案
首先False
通过反转掩码~
和排序值(如有必要)过滤值,然后使用阈值过滤组,最后按以下方式创建Group
列factorize
:
df = df[~df['isCorrect']].sort_values(['Host','Time'])
mask = df['Host'].map(df['Host'].value_counts()) >= 3
df = df[mask].copy()
df['Group'] = pd.factorize(df['Host'])[0] + 1
print (df)
Time Host isCorrect Group
2 10:03 HostA False 1
3 10:15 HostA False 1
4 10:16 HostA False 1
5 10:18 HostB False 2
8 10:22 HostB False 2
9 10:23 HostB False 2
如果按连续False
s 分组:
m = ~df['isCorrect']
df['Group'] = df['isCorrect'].cumsum()[m]
df = df[m].sort_values(['Host','Time'])
mask = df.groupby(['Group', 'Host'])['Group'].transform('size') >= 3
df = df[mask].copy()
df['Group'] = pd.factorize(df['Host'])[0] + 1
print (df)
Time Host isCorrect Group
2 10:03 HostA False 1
3 10:15 HostA False 1
4 10:16 HostA False 1
推荐阅读
- java - 如何使用 Java 和 Thymeleaf 将变量值传递给 HTML
- docker - Docker 容器 (Kubernetes):Mysql 用户访问被拒绝
- sql - 提取日间记录
- c# - c# VSTO 循环遍历每一行并根据另一个单元格值设置格式
- python - 如何解决 Python Flask 套接字错误?
- javascript - 无法迭代接口。循环变量导致未定义
- javascript - 在 Typescript/Javascript 中的 String 数组中查找第一次出现的字符串
- forms - 限制自适应表单 AEM 中的未来日期选择
- php - 如何使用 Laravel 迁移将字符串列类型转换为整数?
- excel - 过滤后如何选择范围?