Страницы

Поиск по вопросам

понедельник, 11 марта 2019 г.

Проиндексировать единицы в датафрейме, но не считать нули

Есть DataFrame, в котором записаны нули и единицы,
df = pd.DataFrame({'A': [0,0,1,1,1,0,1]})
A 0 0 1 0 2 1 3 1 4 1 5 0 6 1
Необходимо пронумеровать только 1, а 0 оставить без изменения, т.е. должны получить:
A 0 0 1 0 2 1 3 2 4 3 5 0 6 1


Ответ

In [186]: df.groupby(df['A'].diff().ne(0).cumsum()).cumsum() Out[186]: A 0 0 1 0 2 1 3 2 4 3 5 0 6 1
Пошагово:
разница между текущей и предыдущей строкой:
In [2]: df['A'].diff() Out[2]: 0 NaN 1 0.0 2 1.0 3 0.0 4 0.0 5 -1.0 6 1.0 Name: A, dtype: float64
сравниваем значения из шага [2] с 0
In [3]: df['A'].diff().ne(0) Out[3]: 0 True 1 False 2 True 3 False 4 False 5 True 6 True Name: A, dtype: bool
кумулятивно суммируем то что получилось на предыдущем шаге [3] (в Python - False == 0, True == 1):
In [4]: df['A'].diff().ne(0).cumsum() Out[4]: 0 1 1 1 2 2 3 2 4 2 5 3 6 4 Name: A, dtype: int32
дальше группируем по значениям из шага [4] и считаем кумулятивную сумму:
In [8]: df.groupby(df['A'].diff().ne(0).cumsum()).cumsum() Out[8]: A 0 0 1 0 2 1 3 2 4 3 5 0 6 1

Комментариев нет:

Отправить комментарий