Сравнение значений из одного столбца
Есть следующая таблица:
Необходимо заполнить promo_cw последовательно идущими числами от 0, в случае если в period_id есть также непрерывная последовательность чисел. Если последовательность в period_id нарушается, то значения в promo_cw обнуляются.
Ожидаемый результат: Столбец promo_cw состоит из последовательности чисел, которая заканчивается при прерывании последовательности чисел в столбце period_id. После прерывания со следующей строки столбца promo_cw новая последовательность начинается с 0 и цикл повторяется.
На данный момент есть такой код:
for j in range(0, 1000): #для заполнения promo_cw
for i in promo.index: #для итерации по period_id
now = promo.loc[i, 'period_id']
prev = promo.loc[i - 1, 'period_id'] + 1
if now == prev:
promo_cw.append(j)
else:
promo_cw.append(0)
promo
Выдает
KeyError: -1
Заранее спасибо
Ответы (2 шт):
Вот такое красивое(имхо) решение придумал)
Можно и попроще, но здесь свое и универсальное) В частности можно укоротить, просто перенеся логику __iadd__ в сам метод __call__.
class X:
def __init__(self):
self.__num = 0
def __iadd__(self, other):
self.__num = self.__num + other
return self.__num
def __call__(self, num=None):
if num is None:
return self.__iadd__(1)
else:
self.__num = num
return self.__num
i = X()
dictionary = {f'{el}': i() if el-1 in array else i(0) for el in array}
UPD: Ну и, конечно же, вместо словаря и списка тут должны быть пандасовские серии, просто у меня проблемки с пандасом
Вроде ничего сложного, только немного подумать, ну и знать про всякие аггрегатные функции типа cumsum и cumcount. Здесь я и создаю тестовый датафрейм и вычисляю поля, всё в "векторном" виде, без циклов:
import pandas as pd
period_id = [x for x in range(15) if x not in [5,8,12]]
promo = pd.DataFrame({'period_id': period_id})
promo['promo_id'] = ((promo.period_id - promo.period_id.shift()).fillna(1) != 1).cumsum() + 1
promo['promo_cw'] = promo.groupby('promo_id').cumcount()
promo
Потом наверняка придёт MaxU, уважаемый, и сделает тоже самое через query.

