Есть 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
Комментариев нет:
Отправить комментарий