Подсчитайте максимальное количество последовательных вхождений строки в столбце фрейма данных

У меня есть фрейм данных panda, в котором я хотел бы подсчитать количество последовательных вхождений определенной строки в одном столбце.

Допустим, у меня есть следующий фрейм данных.

   col1
0  string1
1  string1
2  string1
3  string2
4  string3
5  string3
6  string1

Я хотел бы определить a как количество максимальных последовательных вхождений, например, string1 или любой другой строки в col1.

В этом случае aдолжен вернуть 3, если я хочу найти string1 и вернуть 2 для string3.

Как этого добиться?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Может выполнять обычный трюк группировки последовательных значений:

df1 = df.groupby((df.col1 != df.col1.shift()).cumsum().rename(None)).col1.agg(['size', 'first'])
#   size    first
#1     3  string1
#2     1  string2
#3     2  string3
#4     1  string1

Затем sort_values + drop_duplicates, чтобы найти самый большой:

df1 = df1.sort_values('size').drop_duplicates('first', keep='last').set_index('first').rename_axis(None)
#         size
#string2     1
#string3     2
#string1     3

Итак, теперь вы можете легко найти их:

df1.loc['string1']
#size    3
#Name: string1, dtype: int64
df.col1.groupby(df.col1.ne(df.col1.shift()).cumsum()).size()‌​.max()
piRSquared 09.04.2019 16:40

@piRSquared просто хочу поздороваться с вами, сэр :-)

BENY 09.04.2019 16:54

Спасибо. Это именно то, что я искал.

Sd Junk 09.04.2019 17:00

Просто itertoolsgroupby, порядок здесь такой же, как и в оригинальном df

import itertools 
pd.DataFrame([x,len(list(y))] for x , y in itertools.groupby(df['col1']))
Out[92]: 
         0  1
0  string1  3
1  string2  1
2  string3  2
3  string1  1

pd.DataFrame([x,len(list(y))] for x , y in itertools.groupby(df['col1'])).groupby(0)[1].max()
Out[94]: 
0
string1    3
string2    1
string3    2
Name: 1, dtype: int64

Привет _ _ _ _ _ о/

piRSquared 09.04.2019 16:56

@piRSquared Приятно снова тебя видеть :-)

BENY 09.04.2019 17:02

Спасибо за ваш ответ. Но он по-прежнему возвращает последовательные вхождения для всех строк, когда мне нужно только максимальное число. Я понимаю, что из вашего ответа я могу сделать то же самое sort_values + drop_duplicates, что и в посте, который я выбрал как лучший ответ для достижения того же результата.

Sd Junk 09.04.2019 17:04

@SdJunk groupby+max

BENY 09.04.2019 17:08

Спасибо за обновление. Это работает для того, что я намереваюсь сделать сейчас

Sd Junk 09.04.2019 17:25

Другие вопросы по теме