Python Pandas: создайте непрерывные значения идентификатора, используя «значения флага» в столбце df и отображая его в другом столбце - PullRequest
0 голосов
/ 01 февраля 2019

У меня очень большой фрейм данных (20.000.000+ строк), который содержит среди прочих столбец с именем «последовательность».

Столбец «последовательность» рассчитывается на основе временного ряда с применением нескольких условных операторов.Значение «2» обозначает начало последовательности, значение «3» обозначает конец последовательности, значение «1» обозначает точку данных в последовательности, а значение «4» обозначает точки данных, которые необходимо игнорировать.(Примечание: значения флага не обязательно должны быть 1,2,3,4)

Чего я хочу добиться - это непрерывного значения идентификатора (записанного в отдельном столбце - см. «Required_Id_Output» впример ниже), который маркирует фрагменты последовательностей от 2 до 3 уникальным способом (длина последовательности варьируется в диапазоне от 2 [только начало + конец] до 5000+ точек данных), чтобы иметь возможность выполнять дальнейшие групповые вычисления наотдельные последовательности.

index  sequence    desired_Id_Output    
0          2                  1                   
1          1                  1                   
2          1                  1                   
3          1                  1                   
4          1                  1                   
5          3                  1                   
6          2                  2                   
7          1                  2                   
8          1                  2                   
9          3                  2                   
10         4                  NaN                   
11         4                  NaN                   
12         2                  3                   
13         3                  3                   

Заранее спасибо и БР!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Работает ли подсчет начала последовательности?А затем просто установите значения игнорирования (флаг 4) после этого.Как это:

sequence_starts = df.sequence == 2
sequence_ignore = df.sequence == 4
sequence_id = sequence_starts.cumsum()
sequence_id[sequence_ignore] = numpy.nan
0 голосов
/ 01 февраля 2019

Я не могу придумать ничего лучше, чем «тупое» решение циклического прохождения всего этого, что-то вроде этого:

import numpy as np    

counter = 0
tmp = np.empty_like(df['sequence'].values, dtype=np.float)

for i in range(len(tmp)):
    if df['sequence'][i] == 4:
        tmp[i] = np.nan
    else:
        if df['sequence'][i] == 2:
            counter += 1
        tmp[i] = counter
df['desired_Id_output'] = tmp

Конечно, это будет довольно медленно с 20М-размерный DataFrame.Одним из способов улучшить это является своевременная компиляция с numba:

import numba

@numba.njit
def foo(sequence):
    # put in appropriate modification of the above code block
    return tmp

и вызов это с аргументом df['sequence'].values.

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