Идентификация шаблона в наборе данных с использованием python - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть датафрейм, который выглядит примерно так:

empl_ID day_1  day_2  day_3  day_4  day_5  day_6  day_7  day_8  day_9  day_10
 1        1      1      1      1      1      1      0      1      1      1
 2        0      0      1      1      1      1      1      1      1      0
 3        0      1      0      0      1      1      1      1      1      1
 4        1      0      1      0      1      1      1      0      1      0
 5        1      0      0      1      1      1      1      1      1      1
 6        0      0      0      0      1      1      1      1      1      1

Как мы видим, у нас 6 сотрудников, а индекс 1 указывает на их присутствие в этот день. Я хочу написать код, используя Python, чтобы я мог отслеживать 2 непрерывных отсутствия, т. Е. Шаблон 0, 0 для дня i, дня i + 1 в течение 6 дней, начиная с того момента, когда человек начинает свою работу.

Например, сотрудник 1 начинает свою работу со столбца day_1, который является его первым появлением 1. Итак, со столбцов day_1 до day_6, если мы не наблюдаем непрерывный 0, 0, запись должна быть помечена как ' 0' . То же самое относится к сотруднику 2 (столбцы: день_3 - день_8), сотруднику 4 (столбцы: день_1 - день_6) и сотруднику 6 (столбцы: день_5 - день_10), и они будут помечены как «0».

Однако для сотрудника 3 (столбцы: от дня_2 до дня_7), сотрудника 6 (столбцы: от дня_5 до дня_10) они содержат шаблон 0, 0 сразу после их первого присутствия 1 в течение соответствующего периода времени и, таким образом, будут помечены как ' 1 '.

Было бы очень полезно, если бы кто-то помог мне сформулировать код для достижения вышеуказанной цели. Заранее спасибо!

Результат должен выглядеть примерно так:

empl_ID day_1 day_2 day_3 day_4 day_5 day_6 day_7 day_8 day_9 day_10 label
 1        1     1     1     1     1     1     0     1     1     1      0
 2        0     0     1     1     1     1     1     1     1     0      0
 3        0     1     0     0     1     1     1     1     1     1      1
 4        1     0     1     0     1     1     1     0     1     0      0
 5        1     0     0     1     1     1     1     1     1     1      1
 6        0     0     0     0     1     1     1     1     1     1      0

1 Ответ

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

Проверка с idxmcx и для l oop со смещением

s=df.set_index('empl_ID')
idx=s.columns.get_indexer(s.idxmax(1))
l=[(s.iloc[t, x :y].eq(s.iloc[t, x :y].shift())&s.iloc[t, x :y].eq(0)).any() for t , x ,y in zip(df.index,idx,idx+5)]
df['Label']=l
df
   empl_ID  day_1  day_2  day_3  day_4  ...  day_7  day_8  day_9  day_10  Label
0        1      1      1      1      1  ...      0      1      1       1  False
1        2      0      0      1      1  ...      1      1      1       0  False
2        3      0      1      0      0  ...      1      1      1       1   True
3        4      1      0      1      0  ...      1      0      1       0  False
4        5      1      0      0      1  ...      1      1      1       1   True
5        6      0      0      0      0  ...      1      1      1       1  False
[6 rows x 12 columns]
...