Как добавить столбец счетчика, который начинается и останавливается в определенных строках в Pandas DataFrame? - PullRequest
1 голос
/ 09 июля 2019

У меня есть существующий DataFrame в Pandas, в котором есть столбец, содержащий 3 разных значения (Column1). Я хочу иметь возможность создать столбец, чтобы он подсчитывал каждую строку при каждом «Начале» и прекращал считать при следующем «Конце» (Столбец2). Каков наилучший способ сделать это? Я не уверен, как подойти к этой проблеме, и вывод является строгим требованием.

Пример вывода:

    Column1    Column2
    0          0
    0          0
    0          0
    0          0
    Start      1
    0          2
    0          3
    0          4
    End        5
    0          0
    0          0
    0          0
    Start      1
    0          2
    End        3

1 Ответ

1 голос
/ 09 июля 2019

mask + ffill

В этом ответе предполагается, что в фрейме данных появляется Start до и End, иначе заполнение будет отменено.


col = df['Column1']

m = col.ne('Start') & col.shift().ne('End')

v = col.eq('Start').mask(m).ffill().fillna(0)

v.groupby(v.ne(v.shift()).cumsum()).cumsum()

0     0.0
1     0.0
2     0.0
3     0.0
4     1.0
5     2.0
6     3.0
7     4.0
8     5.0
9     0.0
10    0.0
11    0.0
12    1.0
13    2.0
14    3.0
Name: Column1, dtype: float64

Объяснение

Сначала найдите любое значение, которое не начало или конец

>>> m
0      True
1      True
2      True
3      True
4     False
5      True
6      True
7      True
8      True
9     False
10     True
11     True
12    False
13     True
14     True
Name: Column1, dtype: bool

Далее mask любое недопустимое значение и ffill, что означает, что все значения между Start и End с должны быть заполнены 1

>>> v
0     0.0
1     0.0
2     0.0
3     0.0
4     1.0
5     1.0
6     1.0
7     1.0
8     1.0
9     0.0
10    0.0
11    0.0
12    1.0
13    1.0
14    1.0
Name: Column1, dtype: float64

Наконец, сгруппируйте по последовательным повторным значениям, и cumsum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...