Как использовать функцию сдвига pandas вместе с указанными условиями c столбца - PullRequest
0 голосов
/ 10 марта 2020

У меня есть фрейм данных, который выглядит следующим образом (показан последний столбец с результатом, который я хочу получить ):

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.

Оценило бы, какие исправления я могу внести.

1 Ответ

1 голос
/ 10 марта 2020

Полагаю, вы могли бы использовать np.where() и присвоить значение first_final как 0 или 1, используя df.shift() в условии np.where().

Примерно так: np.where принимает первый аргумент в качестве условия, а второй аргумент - истинное значение, а третий аргумент - ложное значение

df['first_final'] = np.where((df['first_initial_pass']!=0.5), df['first_initial_pass'],
                             np.where((df['first_initial_pass'].shift(1)==1.0)&
                                      (df['first_initial_pass'].shift(2)==1.0),
                                      1, 0))

Вывод:

                  timestamp  first_actual  ...  first_initial_pass first_final
0  2019-05-03T06:00:00.000Z         3.125  ...                 1.0         1.0
1  2019-05-03T18:00:00.000Z         2.975  ...                 1.0         1.0
2  2019-05-04T06:00:00.000Z         2.825  ...                 0.5         1.0
3  2019-05-04T18:00:00.000Z         2.675  ...                 0.0         0.0
4  2019-05-05T06:00:00.000Z         2.525  ...                 0.5         0.0

Обратите внимание, что вы должны быть осторожны с первыми двумя строками, если значение равно 0,5, тогда это будет 0, поскольку df.shift() не учитывает его.

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