В мире нет ничего более постоянного, чем непостоянство (С. Батлер). Объекты в Python делятся на неизменяемые (целые, дробные, строчные, кортежи) и изменяемые (например, списки, словари, множества), в зависимости от чего их поведение при модификации может иметь неожиданный характер.
При изменении значения неизменяемого типа, создастся другой объект. Это можно установить путем вывода его идентификатора со встроенной функцией id:
В случае модификации списка, его идентификатор не поменяется, так как тип - изменяемый:
Это касается и Pandas датафрейма:
Ввиду этого распространенной ошибкой является копирование датафрейма через присваивание:
id объекта не меняется, и модификация одного сказывается на другом:
Для получения копии датафрейма правильно использовать метод copy:
Также будьте осторожны при модификации изменяемого объекта, передаваемого через аргумент в функцию:
f модифицировала df2, переданный в качестве аргумента. Также поменялся df1, так как он ссылается на тот же объект, а df3 ожидаемо остался без изменений.