У меня есть фрейм данных, который выглядит следующим образом (показан последний столбец с результатом, который я хочу получить ):
timestamp first_actual first_required location first_initial_pass first_final
2019-05-03T06:00:00.000Z 3.125 0.000 10B 1.0 1.0
2019-05-03T18:00:00.000Z 2.975 0.000 10B 1.0 1.0
2019-05-04T06:00:00.000Z 2.825 0.000 10B **0.5 1.0**
2019-05-04T18:00:00.000Z 2.675 0.000 10B 0.0 0.0
2019-05-05T06:00:00.000Z 2.525 0.000 10B **0.5 0.0**
Он отсортирован по местоположению и отметке времени , Столбец first_initial_pass приводит к трем возможным результатам (0; 0.5; 1) на основе некоторых правил с использованием столбцов first_actual и first_required. Я пытаюсь создать новый столбец (показанный здесь как first_final), который будет копировать значение из столбца 'first_initial_pass', за исключением случаев, когда это значение равно 0,5.
В тех случаях, когда значение first_initial_pass равно 0,5, это значение необходимо изменить на 0 или 1 в столбце 'first_final'. Он должен измениться на 1, если значения в обеих из двух строк над текущей строкой имеют значение 1, в противном случае он должен измениться на 0 (изменения, которые я хочу видеть, отмечены звездочкой в кадре данных).
Я пытаюсь использовать функцию сдвига, чтобы задать эти условия следующим образом:
data_sorted.loc[( (data_sorted[data_sorted['first_initial_pass'] == 0.5]) &
(data_sorted['first_initial_pass'].shift(1) == 1) &
(data_sorted['first_initial_pass'].shift(2) == 1) ), 'first_final'] = 1
Однако я получаю следующую ошибку: "TypeError: невозможно сравнить dtyped [float64] массив со скаляром типа [bool] ", поэтому я пытаюсь оставить боллеановский фрагмент так:
data_sorted.loc[(
(data_sorted['first_initial_pass'].shift(1) == 1) &
(data_sorted['first_initial_pass'].shift(2) == 1) ), 'first_final'] = 1
Однако строки не изменяются так, как мне нужно (то есть только для строк значение 0,5 в столбце first_initial_pass.
Оценило бы, какие исправления я могу внести.