Python 按循环状态分组

Python 按循环状态分组,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个按时间和状态排序的主机数据集,如果正确与否。我只想得到至少连续3次被评为False的主机。也就是说,如果中间有一个真值,计数器应该重置 data = {'time': ['10:01', '10:02', '10:03', '10:15', '10:16', '10:18','10:20','10:21','10:22', '10:23','10:24','10:25','10:26','10:27'], 'host': ['A','B','A','A','A','B',

我有一个按时间和状态排序的主机数据集,如果正确与否。我只想得到至少连续3次被评为False的主机。也就是说,如果中间有一个真值,计数器应该重置

data = {'time': ['10:01', '10:02', '10:03', '10:15', '10:16', '10:18','10:20','10:21','10:22', '10:23','10:24','10:25','10:26','10:27'],
        'host': ['A','B','A','A','A','B','A','A','B','B','B','B','B','B'],
        'isCorrect': [True, True, False, True, False, False, True, True, False, False, True, False, False, False]}

     time host  isCorrect
0   10:01    A       True
1   10:02    B       True
2   10:03    A      False
3   10:15    A       True
4   10:16    A      False
5   10:18    B      False
6   10:20    A       True
7   10:21    A       True
8   10:22    B      False
9   10:23    B      False
10  10:24    B       True
11  10:25    B      False
12  10:26    B      False
13  10:27    B      False
对于此示例数据集,应该有两个集群:

主机B由于第5、8、9行的原因,因为它们连续3次为假。 因第11、12、13行而导致的主机B 请注意,它应该是2个集群,而不是由6个项目组成的1个集群。不幸的是,我的实现正是这样做的

df = pd.DataFrame(data)
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]

返回

     time host  isCorrect  Group
5   10:18    B      False      0
8   10:22    B      False      0
9   10:23    B      False      0
11  10:25    B      False      0
12  10:26    B      False      0
13  10:27    B      False      0
预期的输出如下所示:

     time host  isCorrect  Group
5   10:18    B      False      0
8   10:22    B      False      0
9   10:23    B      False      0
11  10:25    B      False      1
12  10:26    B      False      1
13  10:27    B      False      1

在使用True的累积和进行排序后,已更改生成新列组的解决方案,因为测试了False,所以生成的唯一组在最后一步中分解为:

df = df.sort_values(['host','time'])

df['Group'] = df['isCorrect'].cumsum()
df = df[~df['isCorrect']]

mask = df['Group'].map(df['Group'].value_counts()) >= 3

df = df[mask].copy()
df['Group'] = pd.factorize(df['Group'])[0]
print (df)
     time host  isCorrect  Group
5   10:18    B      False      0
8   10:22    B      False      0
9   10:23    B      False      0
11  10:25    B      False      1
12  10:26    B      False      1
13  10:27    B      False      1

我不确定这是否正确。如果我更改值>=5,它不应该返回任何内容,因为没有主机isCorrect连续至少5次为false?@Chris-tested,您是对的。答案已编辑-对于测试,连续3个组被使用,因为组始终是唯一的。@Chris-In mask=df['Group'].mapdf['Group'].value_counts>=3
df = df.sort_values(['host','time'])

df['Group'] = df['isCorrect'].cumsum()
df = df[~df['isCorrect']]

mask = df['Group'].map(df['Group'].value_counts()) >= 5

df = df[mask].copy()
df['Group'] = pd.factorize(df['Group'])[0]
print (df)
Empty DataFrame
Columns: [time, host, isCorrect, Group]
Index: []