Короткий ответ
Ноутбук хранит состояние выполненных ячеек, а не порядок их запуска, поэтому при выполнении ячеек не по порядку (или повторном запуске части из них) переменные в памяти могут не соответствовать коду сверху вниз; решение — всегда проверять результат через «Restart Kernel & Run All».
Как это работает подробнее
- Как это работает: Jupyter выполняет код в ядре (kernel), которое хранит все объявленные переменные независимо от визуального расположения ячеек в файле; номер выполнения в скобках
[12]показывает порядок запуска, а не порядок в файле.
Что использовать на практике
- На практике: перед тем как считать анализ готовым или отправлять ноутбук коллеге, нужно перезапустить ядро и выполнить все ячейки сверху вниз — это гарантирует, что код действительно воспроизводит результат с нуля, а не зависит от случайного порядка правок.
- Пример и проверка. Ячейка 3: df = df[df['status'] == 'paid'] была выполнена один раз, затем удалена из ноутбука, но переменная df в памяти ядра осталась отфильтрованной. Все последующие ячейки покажут заниженные значения df.shape[0], хотя в видимом коде фильтра уже нет. Проверка: Kernel → Restart & Run All — после перезапуска df.shape[0] вернёт исходное (большее) число строк, что выявит потерянную зависимость.
Подводные камни
- Частые ошибки: правка ячейки с фильтрацией данных в середине ноутбука без повторного запуска последующих ячеек; удаление ячейки, которая создавала переменную, используемую ниже, из-за чего ноутбук перестаёт работать «с нуля»; оставление отладочных
df = df.sample(100)ячеек, которые незаметно подменяют данные для всех последующих расчётов.