Что нового в 2.3.0 (4 июня 2025)#

Это изменения в pandas 2.3.0. См. Примечания к выпуску для полного списка изменений, включая другие версии pandas.

Предстоящие изменения в pandas 3.0#

pandas 3.0 принесет два более значительных изменения в поведение pandas по умолчанию.

Выделенный тип данных для строк по умолчанию#

Исторически pandas представлял строковые столбцы с помощью NumPy object тип данных. Это представление имеет множество проблем: оно не специфично для строк (любой объект Python может быть сохранен в object-массив типа dtype, не только строки) и это часто не очень эффективно (как с точки зрения производительности, так и использования памяти).

Начиная с предстоящего выпуска pandas 3.0, выделенный строковый тип данных будет включён по умолчанию (с поддержкой PyArrow под капотом, если установлен, в противном случае возвращаясь к NumPy). Это означает, что pandas начнёт определять столбцы, содержащие строковые данные, как новый str тип данных при создании объектов pandas, например, в конструкторах или функциях ввода-вывода.

Старое поведение:

>>> ser = pd.Series(["a", "b"])
0    a
1    b
dtype: object

Новое поведение:

>>> ser = pd.Series(["a", "b"])
0    a
1    b
dtype: str

Строковый тип данных, используемый в этих сценариях, в основном будет вести себя как NumPy object, включая семантику пропущенных значений и общие операции с этими столбцами.

Однако введение нового типа данных по умолчанию также будет иметь некоторые критические последствия для вашего кода (например, при проверке на .dtype будучи типом object). Чтобы позволить тестирование до выхода pandas 3.0, эта будущая логика вывода типов данных может быть включена в pandas 2.3 с помощью:

pd.options.future.infer_string = True

См. Руководство по миграции для нового типа данных строк (pandas 3.0) для получения дополнительных сведений об изменениях в поведении и о том, как адаптировать ваш код к новым значениям по умолчанию.

Копирование при записи#

В настоящее время опциональный режим Copy-on-Write будет включен по умолчанию в pandas 3.0. Не будет возможности сохранить устаревшее поведение.

В итоге, новое поведение "копирование при записи" приведет к изменениям в поведении как pandas работает с копиями и представлениями.

  1. Результат любой операция индексирования (выбор подмножества DataFrame или Series любым способом, т.е. включая доступ к столбцу DataFrame как к Series) или любой метод, возвращающий новый DataFrame или Series, всегда ведёт себя как это была копия с точки зрения пользовательского API.

  2. Как следствие, если вы хотите изменить объект (DataFrame или Series), единственный способ сделать это — напрямую изменить сам объект.

Поскольку каждый шаг индексирования теперь ведет себя как копия, это также означает, что «цепное присваивание» (обновление DataFrame с несколькими шагами setitem) перестанет работать. Поскольку это теперь последовательно никогда не работает, SettingWithCopyWarning будет удалено.

Новая семантика поведения подробно объясняется в руководство пользователя о Copy-on-Write.

Новое поведение можно включить начиная с pandas 2.0 с помощью следующей опции:

pd.options.mode.copy_on_write = True

Некоторые изменения в поведении допускают чёткое устаревание, как изменения в цепочке присваиваний. Другие изменения более тонкие, поэтому предупреждения скрыты за опцией, которую можно включить начиная с pandas 2.2:

pd.options.mode.copy_on_write = "warn"

Этот режим будет предупреждать во многих различных сценариях, которые на самом деле не имеют отношения к большинству запросов. Мы рекомендуем изучить этот режим, но не обязательно избавляться от всех этих предупреждений. руководство по миграции подробнее объясняет процесс обновления.

Улучшения#

Другие улучшения#

Устаревшие функции#

  • Устарело разрешение не-bool значения для na в str.contains(), str.startswith(), и str.endswith() для типов данных, которые еще не запрещают это (GH 59615)

  • Устарел "pyarrow_numpy" опция хранения для StringDtype (GH 60152)

  • Устаревание установки аргумента include_groups to True в DataFrameGroupBy.apply() был повышен из DeprecationWarning to FutureWarning; только False будет разрешено (GH 7155)

Исправления ошибок#

Числовой#

  • Ошибка в Series.mode() и DataFrame.mode() с dropna=False где не все типы данных сортировались бы при наличии NA значения (GH 60702)

  • Ошибка в Series.round() где TypeError всегда вызывал бы исключение с object тип данных (GH 61206)

Строки#

  • Ошибка в Series.__pos__() и DataFrame.__pos__() где Exception не было вызвано для StringDtype с storage="pyarrow" (GH 60710)

  • Ошибка в Series.rank() для StringDtype с storage="pyarrow" который некорректно возвращал целочисленные результаты с method="average" и вызывал ошибку, если это привело бы к усечению результатов (GH 59768)

  • Ошибка в Series.replace() с StringDtype при замене нестроковым значением не выполнялось повышение типа до object тип данных (GH 60282)

  • Ошибка в Series.str.center() с StringDtype с storage="pyarrow" не соответствует поведению python в крайних случаях с нечетным количеством заполняющих символов (GH 54792)

  • Ошибка в Series.str.replace() когда n < 0 для StringDtype с storage="pyarrow" (GH 59628)

  • Ошибка в Series.str.slice() с отрицательным step с ArrowDtype и StringDtype с storage="pyarrow" даёт некорректные результаты (GH 59710)

Индексирование#

  • Ошибка в Index.get_indexer() циклическое преобразование через строковый тип данных, когда infer_string включен (GH 55834)

I/O#

  • Ошибка в DataFrame.to_excel() который хранил десятичные числа как строки вместо чисел (GH 49598)

Другие#

  • Исправлено использование inspect когда опциональные зависимости pyarrow или jinja2 не установлены (GH 60196)

Участники#

Всего 24 человека внесли патчи в этот выпуск. Люди с «+» рядом с именами внесли патч впервые.

  • ChiLin Chiu +

  • Ирв Ластиг

  • Isuru Fernando +

  • Jake Thomas Trevallion +

  • Joris Van den Bossche

  • Kevin Amparado +

  • LOCHAN PAUDEL +

  • Lumberbot (он же Джек)

  • Marc Mueller +

  • Marco Edward Gorelli

  • Мэтью Рёшке

  • Команда разработчиков Pandas

  • Patrick Hoefler

  • Richard Shadrach

  • SALCAN +

  • Себастьян Берг

  • Simon Hawkins

  • Thomas Li

  • Уилл Айд

  • William Andrea

  • William Ayd

  • dependabot[bot]

  • jbrockmendel

  • tasfia8 +