Найти тему
Властелин машин

Откуда возникает самое распространенное предупреждение Pandas, и как его обойти

Имя этому предупреждению - SettingWithCopyWarning. Оно вызывается из-за возможной проблемы при модификации данных, когда либо изменения вообще не произойдут, либо появятся там, где вы можете их не ожидать. Рассмотрим простой датафрейм:

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

-2

в то же время, если обратиться так, то изменения в первоисточнике появятся:

-3

Однако рекомендованным способом внесения изменений в срез датафрейма является с использованием оператора loc. Пересоздадим таблицу и применим данный способ:

-4

Вместе с тем большая доля предупреждений приходится при модификации ранее созданной ссылки или копии на датафрейм. Например, при указанном ниже способе возвращается копия и изменения не затронут первоисточник:

-5

С использованием же оператора loc вы гарантируете, что работаете со срезом первоисточника:

-6

Если же вы хотите работать с копией и обезопасить себя от изменения первоисточника явно добавляйте метод copy при создании новой переменной, даже когда это происходит внутри функции. Например, часто предупреждение возникает при создании выборок из данных посредством train_test_split:

-7

Несмотря на то, что функцией возвращается копия, вылетает предупреждение. Если же вы явно передадите в train_test_split параметр df1.copy(), оно не возникнет:

-8

Более грубым способом обхода предупреждения является его запрет:

-9

или вообще запрет всех предупреждений:

import warnings
warnings.filterwarnings('ignore')

Последние два способа не рекомендую: лучше бороться с причиной, нежели закрывать на нее глаза.

-10