Як виправити в pandas: settingwithcopywarning


Одне попередження, яке ви можете зустріти під час використання панд:

 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:

 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
Як виправити: стовпці перекриваються, але суфікс не вказано

Додати коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *