Подсчет последовательных вхождений в кадре данных на основе условия - PullRequest
2 голосов
/ 17 мая 2019

Я пытаюсь выяснить, присутствуют ли 3 или более вхождений любого последовательного числа в столбце, и, если это так, пометить последний с 1, а остальные с нулями.

df['a'] = df.assign(consecutive=df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size')).query('consecutive > @threshold') вот что я нашел здесь: Идентификация последовательных вхождений значения однако это дает мне ошибку: ValueError: Wrong number of items passed 6, placement implies 1. Я понимаю проблему, что это не может быть напечатано в кадре данных, но каков будет правильный подход для получения это желаемый результат?

Во-вторых, если это условие выполнено, я хотел бы выполнить уравнение (например, 2 * b) для нескольких строк, соседних (либо предыдущих, либо последующих результатов) с 1 (подобно функции сдвига, но затем повторяющихся, например, для 3 предыдущих строк ). Я совершенно уверен, что это должно быть возможно, но я не смог заставить эту цель работать. Оно не обязательно должно основываться на том, что указано в столбце с, это всего лишь предложение.

небольшая выдержка из данных ниже для интерпретации, столбцы c и d представляют желаемый результат: a b c d 16215 2 0 0 24848 4 0 0 24849 4 0 8 24850 4 0 8 24851 4 1 8 24852 6 0 0 24853 6 0 0 24854 8 0 0 24855 8 0 0 24856 8 0 16 25208 8 0 16 25932 8 1 16 28448 10 0 0 28449 10 0 0 28450 10 0 0

1 Ответ

1 голос
/ 17 мая 2019

Используя cumsum с diff, создайте ключ группы, затем найдите последнюю позицию каждой группы, когда ее общее значение count больше 3, затем мы используем bfill с limit

s=df.b.diff().ne(0).cumsum()
s1=s.groupby(s).transform('count')
s2=s.groupby(s).cumcount()

df['c']=((s1==s2+1)&(s1>3)).astype(int)

df['d']=(df.c.mask(df.c==0)*df.b*2).bfill(limit=2).combine_first(df.c) 

df
Out[87]: 
        a   b  c     d
0   16215   2  0   0.0
1   24848   4  0   0.0
2   24849   4  0   8.0
3   24850   4  0   8.0
4   24851   4  1   8.0
5   24852   6  0   0.0
6   24853   6  0   0.0
7   24854   8  0   0.0
8   24855   8  0   0.0
9   24856   8  0  16.0
10  25208   8  0  16.0
11  25932   8  1  16.0
12  28448  10  0   0.0
13  28449  10  0   0.0
14  28450  10  0   0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...