Как исправить этот код, чтобы не вызывать SettingWithCopyWarning?Python

Программы на Python
Ответить
Anonymous
 Как исправить этот код, чтобы не вызывать SettingWithCopyWarning?

Сообщение Anonymous »

Я следую этому: https://www.kdnuggets.com/2021/01/clean ... pipes.html
Примерно на полпути автор создает функцию для удаления выбросов:

Код: Выделить всё

def to_category(df):
cols = df.select_dtypes(include='object').columns
for col in cols:
ratio = len(df[col].value_counts()) / len(df)
if ratio < 0.05:
df[col] = df[col].astype('category')
return df
Это вызвало предупреждение от Python:

Код: Выделить всё

Warning (from warnings module):
File "D:/I7_Education/pandas_pipe_function1/pipes3.py", line 51
df[col] = df[col].astype('category')
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

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
Я не уверен, что понимаю, в чем проблема (хотя я работаю над ее решением и публикую несколько сообщений в Интернете, чтобы попытаться понять). Я все еще пытаюсь понять смысл объяснений в документации.
Я знаю, что могу подавить предупреждения из Python (код работает нормально, если вы подавите предупреждения). Я хотел бы знать, как изменить код в статье, чтобы он вообще не вызывал предупреждения.
Я пытался связаться с автором, но не получил ответа.
Я хочу, чтобы в подавлении не было необходимости. Но я не понимаю, в чем проблема, настолько хорошо, чтобы понять, как изменить код, чтобы вообще не вызывать срабатывание SettingWithCopyWarning.
Я не ожидал предупреждения. В документации, а также в нескольких сообщениях в Интернете говорится, что нужно изменить df с помощью loc, но я не меняю значения или элементы в кадре данных, я меняю dtype столбцов с объекта на категорию; astype('category') - это то, как это сделать, и я предполагаю, что цикл по столбцам для этого должен быть в порядке.
Друг посоветовал мне создать копию df, который передается в функцию, а затем манипулировать ею, а затем вернуть копию, что я также не до конца понимаю, но это не решает проблему - он все равно выдает то же предупреждение.
Фрейм данных, который я передаю функции, копия. Статья лишь манипулирует набором данных (directmarketing.csv); он считывает CSV в кадр данных Pandas и напрямую манипулирует им. Вместо этого я создал два фрейма данных: первый

Код: Выделить всё

dataset = pd.read_csv(".\directmarketing.csv")
и второе

Код: Выделить всё

marketing = dataset.copy()
Я всего лишь манипулирую маркетинговыми данными. Таким образом, я могу вернуться и проверить фрейм данных набора данных и убедиться, что все изменилось так, как предполагалось, и т. д.
Но когда я вызываю функцию, я вызываю to_category(marketing) - я вообще не трогал фрейм данных набора данных.
В stackoverflow есть поток - возврат копии вместо предупреждения о представлении при использовании фрейма данных Python pandas - там говорится об этом, но он говорит, что нужно сделать копию, чтобы избежать предупреждения, и поэтому я очень запутался.
Есть ли способ исправить код в статье, чтобы он не вызывал это предупреждение?
Я использую Python 3.10 и Idle — я не использую с этим IDE.

Подробнее здесь: https://stackoverflow.com/questions/764 ... opywarning
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»