python - 连续相似字符串的计数
问题描述
我有一个数据框:
Id Seqno. Event
1 2 A
1 3 B
1 5 A
1 6 A
1 7 A
1 8 B
1 9 C
1 10 D
我想根据“事件 A 连续发生”的时间过滤数据框。例如,如果我尝试 Event A > 2 它应该将所有 Id 返回为
Id Event count
1 A 3
到目前为止我已经尝试过
df['new'] = df['Event'].shift()+ df['Event']
a= df[df['new']=='AA']
a[a['Id'].isin(a['Id'].value_counts()[a['Id'].value_counts()>2].index)]
但这似乎不起作用。
解决方案
这个问题可以分为两部分。首先,您要按系列Id
中的 , 和连续元素进行分组Event
。这可以使用shift
+来完成cumsum
m = df.Event.ne(df.Event.shift()).cumsum()
df['count'] = df.groupby(['Id', m])['Event'].transform('size')
print(df)
Id Seqno. Event count
0 1 2 A 1
1 1 3 B 1
2 1 5 A 3
3 1 6 A 3
4 1 7 A 3
5 1 8 B 1
6 1 9 C 1
7 1 10 D 1
这为我们提供了一个序列,用于识别我们Event
列中的顺序运行,但现在我们想让查找变得简单。我们可以drop_duplicates
, 让每个条件只返回一次运行 per Id/Event/count
,然后使用布尔索引:
f = df[['Id', 'Event', 'count']].drop_duplicates()
f.loc[f.Event.eq('A') & f['count'].gt(2)]
Id Event count
2 1 A 3