首页 > 解决方案 > 连续相似字符串的计数

问题描述

我有一个数据框:

   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)]

但这似乎不起作用。

标签: pythonpandasdataframe

解决方案


这个问题可以分为两部分。首先,您要按系列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

推荐阅读