Как исправить в pandas: settingwithcopywarning


Одно предупреждение, с которым вы можете столкнуться при использовании pandas:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.

Это предупреждение появляется, когда панды сталкиваются с чем-то, называемым цепным присвоением — сочетанием цепочки и присваивания за один шаг.

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

Самый простой способ подавить это предупреждение — использовать следующий фрагмент кода:

 p.d. options . fashion . chained_assignment = None

В следующем примере показано, как на практике реагировать на это предупреждение.

Как воспроизвести предупреждение

Предположим, мы создаем следующий DataFrame pandas:

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29],
                   ' B ': [5, 7, 7, 9, 12, 9, 9, 4],
                   ' C ': [11, 8, 10, 6, 6, 5, 9, 12]})

#view DataFrame
df

	A B C
0 25 5 11
1 12 7 8
2 15 7 10
3 14 9 6
4 19 12 6
5 23 9 5
6 25 9 9
7 29 4 12

Теперь предположим, что мы создаем новый DataFrame, который содержит только столбец «A» из исходного DataFrame, и делим каждое значение в столбце «A» на 2:

 #define new DataFrame
df2 = df[[' A ']]

#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2

/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

Мы получаем сообщение SettingWithCopyWarning , поскольку устанавливаем новые значения для столбца «A» в «срезе» исходного DataFrame.

Однако, если мы посмотрим на новый созданный нами DataFrame, мы увидим, что каждое значение фактически было успешно разделено на 2:

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Несмотря на то, что мы получили предупреждающее сообщение, панды все равно сделали то, что мы ожидали.

Как избежать предупреждения

Чтобы избежать этого предупреждения, рекомендуется использовать синтаксис .loc[индексатор строк, индексатор столбцов] следующим образом:

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Новый DataFrame содержит все значения из столбца «A» исходного DataFrame, разделенные на два, и никаких предупреждающих сообщений не появляется.

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

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

Подробное объяснение того, почему следует избегать назначения цепочек, можно найти в онлайн-документации pandas .

Дополнительные ресурсы

Как исправить: нет модуля с именем pandas.
Как исправить: нет модуля с именем numpy
Как исправить: столбцы перекрываются, но суффикс не указан

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *