Как обновить значение в DataFrame с маской при переборе строк - PullRequest
0 голосов
/ 15 декабря 2018

С помощью приведенного ниже кода я пытаюсь обновить столбец df_test['placed'] до = 1, когда сработает оператор if и сделан прогноз.Я не смог заставить это корректно обновляться, хотя код компилируется, но не обновляется до = 1 для соответствующих размещенных прогнозов.

df_test['placed'] = np.zeros(len(df_test))
for i in set(df_test['id']) :
    mask = df_test['id']==i
    predictions = lm.predict(X_test[mask])
    j = np.argmax(predictions)
    if predictions[j] > 0 :
        df_test['placed'][mask][j] = 1
        print(df_test['placed'][mask][j])

1 Ответ

0 голосов
/ 15 декабря 2018

Ответ на ваш вопрос

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

В части назначения вашего кода, 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 для этого кода.

...