Количество последовательных похожих строк - PullRequest
0 голосов
/ 17 января 2019

У меня есть фрейм данных:

   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> 2 должно вернуть все идентификаторы как

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

Но, похоже, это не работает.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Эту проблему можно разделить на две части.Сначала вы хотите сгруппировать как 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, чтобы каждое условие возвращало только один прогон для 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
0 голосов
/ 17 января 2019

Функция без использования внутренних функций панд (возможно, это лучший способ сделать это):

def eventmagic(event="A", num=2):
    subdf = df[(df["Event"] == event) & (df["Seqno."] > num)].sort_values(by="Seqno.")
    arr = subdf["Seqno."].values - np.arange(len(subdf)) # 5,6,7 to 5,5,5
    if len(arr) == 0: return 0
    i = 0
    while arr[i] == arr[0]:
        i += 1
        if i >= len(subdf):
            break
    return i

>>> eventmagic("B", 2)
1

>>> eventmagic("A", 1)
1

>>> eventmagic("A", 3)
3

>>> eventmagic("A", 10)
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...