Как подсчитать количество одинаковых последовательных значений в столбце с python / pandas? - PullRequest
2 голосов
/ 12 июля 2020

Скажем, у меня есть фрейм данных, например:

df = pd.DataFrame({'A': [1, 1, 2, 3, 3, 3, 1, 1]})

Я хотел бы подсчитать, сколько раз текущее значение столбца было видно в предыдущей строке. Для приведенного выше примера вывод будет:

[1, 2, 1, 1, 2, 3, 1, 2]

Я знаю, как сгруппировать и суммировать все повторяющиеся значения, но я не знаю, как заставить его перезапускаться при каждом новом значении.

т.е.

df['A'].groupby(df['A']).cumcount() 
# returns [0, 1, 0, 0, 1, 2, 2, 3] which is not what I want.

1 Ответ

3 голосов
/ 12 июля 2020

Попробуйте этот метод:

df.groupby((df['A'] != df['A'].shift()).cumsum()).cumcount() + 1

Вывод:

0    1
1    2
2    1
3    1
4    2
5    3
6    1
7    2
dtype: int64

Подробности

Используйте равенство для проверки между текущей строкой и следующей строкой, затем cumsum для создайте новую группу для каждого изменения в 'A', затем groupby и cumcount добавив 1, чтобы начать с 1 вместо нуля.

Разбить на шаги

Разбить на шаги чтобы вы могли видеть прогресс в столбцах фрейма данных.

df['grp'] = df['A'] != df['A'].shift() 
#for numbers you can use df['A'].diff().ne(0) 
#however using inquality check is more versatile for strings
df['cumgroup'] = df['grp'].cumsum()
df['count'] = df.groupby('cumgroup').cumcount() + 1
df

Вывод:

   A    grp  cumgroup  count
0  1   True         1      1
1  1  False         1      2
2  2   True         2      1
3  3   True         3      1
4  3  False         3      2
5  3  False         3      3
6  1   True         4      1
7  1  False         4      2
...