Создать новый столбец на основе группового сдвига в pandas - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть фрейм данных, как показано ниже

Session      slot_num        Overbook     ID
s1           1               no           A
s1           2               no           B
s1           2               yes          B
s1           3               no           C
s1           4               no           D
s1           4               yes          D
s1           5               no           E
s1           6               no           F
s1           7               no           G
s2           1               no           A1
s2           2               no           B1
s2           2               no           C1
s2           3               yes          C1
s2           4               no           D1
s2           4               no           E1
s2           5               no           F1
s2           6               no           G1
s2           5               yes          G1

Шаг 1: Исходя из вышеизложенного, я хотел бы создать столбец Overbook1, который является сдвинутой версией Overbook вверх, как показано ниже при групповом сеансе.

Теперь мы получаем

Session      slot_num        Overbook     ID    Overbook1
s1           1               no           A     no
s1           2               no           B     yes
s1           2               yes          B     no
s1           3               no           C     no
s1           4               no           D     yes
s1           4               yes          D     no
s1           5               no           E     no
s1           6               no           F     no
s1           7               no           G     no
s2           1               no           A1    yes   
s2           2               yes          A1    no
s2           2               no           K1    yes
s2           3               yes          K1    no
s2           4               no           D1    no
s2           4               no           L1    no
s2           5               no           S1    no
s2           6               no           G1    yes
s2           5               yes          G1    no

Шаг 2: Удалить строки, где Overbook == 'yes'

Окончательный ожидаемый результат:

Session      slot_num        Overbook     ID    Overbook1
s1           1               no           A     no
s1           2               no           B     yes
s1           3               no           C     no
s1           4               no           D     yes
s1           5               no           E     no
s1           6               no           F     no
s1           7               no           G     no
s2           1               no           A1    yes   
s2           2               no           K1    yes
s2           4               no           D1    no
s2           4               no           L1    no
s2           5               no           S1    no
s2           6               no           G1    yes

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Первый шаг - создать новый столбец:

df['Overbook1'] = df.groupby('Session').Overbook\
    .apply(lambda s: s.shift(-1, fill_value='no'))

А второй - выбрать только «нужные» строки:

df = df.query('Overbook == "no"')
1 голос
/ 28 апреля 2020

Использовать DataFrameGroupBy.shift с фильтрацией по boolean indexing:

df['Overbook1'] = df.groupby('Session')['Overbook'].shift(-1, fill_value='no')

df = df[df['Overbook'].ne('yes')]
print (df)
    Session  slot_num Overbook  ID Overbook1
0       s1         1       no   A        no
1       s1         2       no   B       yes
3       s1         3       no   C        no
4       s1         4       no   D       yes
6       s1         5       no   E        no
7       s1         6       no   F        no
8       s1         7       no   G        no
9       s2         1       no  A1        no
10      s2         2       no  B1        no
11      s2         2       no  C1       yes
13      s2         4       no  D1        no
14      s2         4       no  E1        no
15      s2         5       no  F1        no
16      s2         6       no  G1       yes
...