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