Короткий ответ
.copy() создаёт независимую копию данных, чтобы изменения в новом объекте не затрагивали исходный DataFrame; без неё часть операций может вернуть view (вид) на те же данные, и изменения отразятся на оригинале неожиданным образом.
Как это работает подробнее
некоторые операции в pandas (например, простой срез по столбцам) могут возвращать view — объект, ссылающийся на ту же память, что и исходный DataFrame, а не на новую копию; изменение такого view способно изменить и исходные данные, что и вызывает печально известный SettingWithCopyWarning.
Пример кода
question-117.py
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3]})
subset = df[df['a'] > 1].copy()
subset['a'] = 0
print(df) # исходный df не изменился
print(subset) # а здесь a = 0Что использовать на практике
- Практика. если планируется модифицировать производный DataFrame (добавлять столбцы, менять значения), а исходный должен остаться неизменным для дальнейших сравнений, стоит сразу явно вызвать .copy(); это особенно важно при создании "рабочих" версий таблицы для экспериментов с очисткой.
- Проверка. после изменения subset исходный df должен остаться [1, 2, 3], что подтверждает независимость копии от оригинала.
Подводные камни
- Частая ошибка. игнорируют предупреждение SettingWithCopyWarning, считая его просто "шумом", хотя оно сигнализирует о реальном риске непредсказуемого поведения; вызывают .copy() избыточно на каждом шаге без необходимости, что расходует память на больших таблицах без реальной пользы.