Короткий ответ
При включённом copy-on-write (режим, ставший поведением по умолчанию с pandas 3.0 и доступный как опция в 2.x) операции, которые раньше могли неявно изменить исходные данные через view, теперь всегда возвращают независимую копию при первой попытке изменения, что делает поведение более предсказуемым, но меняет привычные паттерны кода.
Как это работает подробнее
в классическом режиме часть операций (например, df2 = df[['a','b']]) могла возвращать view, и изменение df2 иногда затрагивало исходный df, иногда — нет, в зависимости от внутренней реализации, что и было источником SettingWithCopyWarning; с copy-on-write любое изменение автоматически создаёт копию "по требованию" именно в момент записи, а не заранее, что устраняет неоднозначность.
Пример кода
question-137.py
import pandas as pd
print(pd.__version__)
pd.set_option('mode.copy_on_write', True)
df = pd.DataFrame({'a': [1, 2, 3]})
sub = df[['a']]
sub.loc[0, 'a'] = 100
print(df) # с copy-on-write исходный df не изменитсяЧто использовать на практике
- Практика. при включении этого режима (pd.set_option('mode.copy_on_write', True) в 2.x) часть кода, ранее опирающегося на побочный эффект изменения через view, перестанет работать как раньше, поэтому перед обновлением версии pandas на продакшен-пайплайнах стоит явно протестировать код; рекомендуется и так писать код в стиле, не зависящем от view/copy (использовать .copy() там, где это нужно по смыслу), чтобы быть независимым от версии.
- Проверка. при включённом copy-on-write исходный df должен остаться [1, 2, 3], тогда как в классическом режиме на некоторых версиях pandas подобная операция могла (хотя и не гарантированно) изменить df.
Подводные камни
- Частая ошибка. обновляют версию pandas в проекте без проверки поведения SettingWithCopyWarning-подобных мест, из-за чего часть "работавшего" кода начинает давать иной результат без явной ошибки; путают copy-on-write с обычным .copy() — это разные механизмы: один про внутреннюю оптимизацию управления памятью, другой — явный метод в коде пользователя.