Вы можете использовать loc
и устанавливать новые значения векторизованным способом.Этот подход намного быстрее, чем использование итерации, поскольку эти операции выполняются сразу для целых столбцов, а не для отдельных значений.Проверьте эту статью , чтобы узнать больше об оптимизации скорости в пандах.
Например:
mask = df['order_mt'] == df['enr_mt']
df.loc[mask, ['new_N_Loan', 'exist_N_Loan', 'exist_V_Loan']] = [1, 0, 0]
df.loc[mask, ['new_V_Loan']] = df['loan_agr']
df.loc[~mask, ['new_N_Loan', 'exist_N_Loan', 'new_V_Loan']] = [0, 1, 0]
df.loc[~mask, ['exist_V_Loan']] = df['loan_agr']
Редактировать:
Если оператор ~
(поразрядно не) не поддерживается в вашей версии панд, вы можете создать новую маску для условия «else», аналогично первому условию.
Например:
mask = df['order_mt'] == df['enr_mt']
else_mask = df['order_mt'] != df['enr_mt']
Затем используйте else_mask
для второго набора определений вместо ~mask
.
Образец:
Ввод:
order_mt enr_mt new_N_Loan exist_N_Loan exist_V_Loan new_V_Loan loan_agr
0 1 1 None None None None 100
1 2 2 None None None None 200
2 3 30 None None None None 300
3 4 40 None None None None 400
Выход:
order_mt enr_mt new_N_Loan exist_N_Loan exist_V_Loan new_V_Loan loan_agr
0 1 1 1 0 0 100 100
1 2 2 1 0 0 200 200
2 3 30 0 1 300 0 300
3 4 40 0 1 400 0 400