Ответ на ваш вопрос
Редактировать: изменение предложения на основе комментариев
В части назначения вашего кода, df_test['placed'][mask][j] = 1
, используется то, что называется цепочкойиндексация .Короче говоря, ваше назначение только изменяет временную копию DataFrame, которая немедленно отбрасывается, и никогда не меняет исходный DataFrame.
Чтобы избежать этого, эмпирическое правило при выполнении назначения: использовать только один набор квадратных скобок в одном кадре данных.Для вашей задачи это должно выглядеть следующим образом:
df_test.loc[mask.nonzero()[0][j], 'placed'] = 1
(я знаю, что mask.nonzero()
использует два набора квадратных скобок; на самом деле nonzero()
возвращает кортеж и первый элемент этого кортежаэто ndarray. Но в фрейме данных используется только один набор, и это важная часть.)
Некоторые другие заметки
Есть пара замечаний по использованию pandas
(& numpy
).
Панды и NumPy обе имеют функцию, называемую широковещание .По сути, если вы присваиваете одно значение целому массиву, вам не нужно сначала создавать массив одинакового размера;Вы можете просто назначить одно значение, и pandas / NumPy автоматически определит, как его применить.Таким образом, первая строка вашего кода может быть заменена на df_test['placed'] = 0
, и она выполняет то же самое.
Вообще говоря при работе с пандами и объектами numpy, петли плохие ;обычно вы можете найти способ использовать некоторую комбинацию широковещания , поэлементных операций и логического индексирования для выполнения цикла.И благодаря тому, как эти функции разработаны, он будет работать намного быстрее.К сожалению, я не достаточно знаком с методом lm.predict
, чтобы сказать, но вы могли бы избежать всего цикла for
для этого кода.