2025, Nov 19 00:03
Баг Polars 1.31.0: DuplicateError в concat_arr и обходные пути
Polars 1.31.0: concat_arr в collect падает с DuplicateError. Объясняем причину и даём обходы: передавайте имена, pl.col по отдельности или берите concat_list.
Переход на Polars 1.31.0 может неожиданно сломать код построения массивов, который раньше работал без проблем. Если вы объединяете несколько столбцов в Array и задаёте имя через alias, во время ленивого collect теперь может всплывать DuplicateError, хотя сам конвейер не менялся.
Как воспроизвести проблему
Рассмотрим выражение, которое формирует 3D‑вектор позиции из трёх числовых столбцов и затем присваивает результату имя:
pl.concat_arr(
pl.col("x_m", "y_m", "z_m")
).alias("antenna_pos_m")
В Polars 1.31.0 это может падать на этапе collect с ошибкой о повторяющемся имени, например такой:
polars.exceptions.DuplicateError: the name 'Antenna_position[m]' is duplicate
Что происходит на самом деле
Это не удаление функциональности. Это известная ошибка в Polars 1.31, которую исправили в основной ветке уже после релиза. Просто ещё не вышел релиз с этим исправлением. Подробности здесь: https://github.com/pola-rs/polars/issues/23267. В документации Polars также помечает Array concat_arr как нестабильный, поэтому несложно понять, как небольшое изменение могло привести к регрессии: https://docs.pola.rs/api/python/dev/reference/expressions/api/polars.concat_arr.html. Поведение не связано конкретно с вашим alias; проблема в том, как в этой версии выражение разрешает имена.
Как исправить прямо сейчас
Самый простой обходной путь — передавать имена столбцов напрямую в concat_arr, а не оборачивать их в один вызов pl.col. Так вы обходите путь, приводящий к дублированию имён в 1.31, и по‑прежнему используете тип данных Array:
pl.concat_arr(
"x_m",
"y_m",
"z_m"
).alias("antenna_pos_m")
Если вам удобнее оставить выражения pl.col, передавайте их в concat_arr отдельными аргументами — это работает и на 1.31:
pl.concat_arr(
pl.col("x_m"),
pl.col("y_m")
)
Ещё один рабочий вариант — перейти на List вместо Array:
pl.concat_list(
pl.col("x_m", "y_m", "z_m")
).alias("antenna_pos_m")
Руководство пользователя Polars ради производительности рекомендует Array вместо List, поэтому первым обходным путём обычно лучше пользоваться, если для вас важна скорость: https://docs.pola.rs/user-guide/expressions/lists-and-arrays/#the-data-type-array. Либо можно зафиксировать Polars на версии 1.30 до выхода 1.32, куда ожидается попадание исправления.
Почему это важно
Даже небольшие обновления библиотеки могут менять разрешение выражений так, что это проявится как ошибки во время выполнения в ленивых пайплайнах. concat_arr помечен как нестабильный, и этот случай наглядно показывает, почему важно читать release notes, фиксировать версии и знать быстрые обходные решения, чтобы сохранить устойчивость продакшен‑кода для данных. Если вы рассчитываете на производительность Array, понимание того, как безопасно вызывать concat_arr в 1.31, избавит от лишних рефакторингов и регрессий.
Выводы
Если объединение в массивы стало падать после перехода на Polars 1.31, воспринимайте это как баг, специфичный для версии, а не как ломающие изменение API. Передавайте имена столбцов напрямую в concat_arr, либо указывайте отдельные вызовы pl.col, либо временно используйте concat_list. По возможности оставайтесь на Polars 1.30 до релиза 1.32 и следите за исходной задачей для обновлений статуса: https://github.com/pola-rs/polars/issues/23267.