Примерно на полпути автор создает функцию для удаления выбросов:
Код: Выделить всё
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
Код: Выделить всё
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
Мобильная версия