@rudolfxcp

Как создать список, который содержит последовательное количество повторений элемента Python?

Есть следующая последовательность

import pandas as pd
a = pd.DataFrame({'index':range(13),'a':[1,1,1,2,2,2,1,1,3,3,4,3,5]})


index   a
0       1
1       1
2       1
3       2
4       2
5       2
6       1
7       1
8       3
9       3
10      4
11      3
12      5


Необходимо посчитать количество повторений каждого элемента и добавить столбец, например Range:

index   a   Range
0       1   1
1       1   2
2       1   3
3       2   1
4       2   2
5       2   3
6       1   1
7       1   2
8       3   1
9       3   2
10      4   1
11      3   1
12      5   1


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

group = a.groupby(["a"])[["index"]]
a = a.assign(Range = a[['index']]-group.transform(min)+1)


Но при попадании одинаковых значений (например, в столбце a идут три единицы подряд, а потом они повторяются в id: 6,7) он считает с того места, где прошлые единицы закончились, т.е. это будет 7,8 единицы в списке:

index   a   Range
0       1   1
1       1   2
2       1   3
3       2   1
4       2   2
5       2   3
6       1   7
7       1   8
8       3   1
9       3   2
10      4   1
11      3   4
12      5   1
  • Вопрос задан
  • 476 просмотров
Пригласить эксперта
Ответы на вопрос 2
@rudolfxcp Автор вопроса
Решил в итоге таким образом:
a['Range'] = a.groupby((a.a != a.a.shift()).cumsum()).cumcount() + 1
Ответ написан
Комментировать
aRegius
@aRegius
Python Enthusiast
Попробуйте адаптировать, как вариант (а может в numpy что-то готовое для таких случаев есть, но я навскидку не помню):
>>> x = [1, 1, 1, 2, 2, 2, 1, 1, 3, 3, 4, 3, 5]
>>> from itertools import groupby
>>> x_groups_count = [num for _, group in groupby(x) for num, _ in enumerate(group, 1)]
>>> x_groups_count
[1, 2, 3, 1, 2, 3, 1, 2, 1, 2, 1, 1, 1]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы