Python 按循环状态分组
我有一个按时间和状态排序的主机数据集,如果正确与否。我只想得到至少连续3次被评为False的主机。也就是说,如果中间有一个真值,计数器应该重置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',
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: []