У меня есть фрейм данных panda, в котором я хотел бы подсчитать количество последовательных вхождений определенной строки в одном столбце.
Допустим, у меня есть следующий фрейм данных.
col1
0 string1
1 string1
2 string1
3 string2
4 string3
5 string3
6 string1
Я хотел бы определить a
как количество максимальных последовательных вхождений, например, string1
или любой другой строки в col1
.
В этом случае a
должен вернуть 3
, если я хочу найти string1
и вернуть 2
для string3
.
Как этого добиться?
Может выполнять обычный трюк группировки последовательных значений:
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
@piRSquared просто хочу поздороваться с вами, сэр :-)
Спасибо. Это именно то, что я искал.
Просто itertools
groupby
, порядок здесь такой же, как и в оригинальном 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 Приятно снова тебя видеть :-)
Спасибо за ваш ответ. Но он по-прежнему возвращает последовательные вхождения для всех строк, когда мне нужно только максимальное число. Я понимаю, что из вашего ответа я могу сделать то же самое sort_values
+ drop_duplicates
, что и в посте, который я выбрал как лучший ответ для достижения того же результата.
@SdJunk groupby+max
Спасибо за обновление. Это работает для того, что я намереваюсь сделать сейчас
df.col1.groupby(df.col1.ne(df.col1.shift()).cumsum()).size().max()