# Polars 1.41.0 — Python Polars 1.41.0 - Product: Polars (https://whatsnew.fyi/product/polars) - Vendor: Polars - Date: 2026-05-22 - Version: 1.41.0 - Original notes: https://github.com/pola-rs/polars/releases/tag/py-1.41.0 - Permalink: https://whatsnew.fyi/product/polars/releases/1.41.0 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — Add LazyFrame.gather - **added** — Add Expr.is_empty - **added** — Add support for the SQL FILTER clause for aggregate functions, and STRING_AGG - **added** — Add null_on_oob in {Expr/Series}.gather - **added** — Add Rust backend for Expr.has_nulls - **added** — Add streaming GatherNode - **changed** — Stabilize streaming engine - **changed** — Stabilize float16 - **changed** — Use true division for the / operator in Polars SQL - **changed** — Dispatch {list,arr}.{unique,n_unique,reverse} to group_by engine - **changed** — Speed up parquet metadata decode with hand-written Thrift - **fixed** — Panic in scan of empty IPC with slice - **fixed** — Persist object_store rebuild state in cache - **fixed** — Sort flag on GroupsType only applies to first element - **fixed** — Don't unwrap channel send in streaming join_asof - **fixed** — Fix merge_sorted panic when List in frame - **fixed** — Raise TypeError when calling next() directly on GroupBy objects - **fixed** — Data type comparison for extension types - **fixed** — Prevent panic when switching from one extension dtype to another - **deprecated** — Deprecate the StringCache ##### 🏆 Highlights - Add LazyFrame.gather (#27501) - Nested common subplan elimination (#27340) - Stabilize streaming engine (#27497) - Speed up parquet metadata decode with hand-written Thrift (#27427) ##### ⚠️ Deprecations - Deprecate the StringCache (#27580) ##### 🚀 Performance improvements - Dispatch `{list,arr}.{unique,n_unique,reverse}` to group\_by engine (#27278) - Improve in-memory grouped non-null count (#27702) - Factor shared conjuncts out of OR-of-ANDs predicates (#27627) - Skip downloading IPC batches exceeding slice bounds (#27683) - Avoid materializing broadcast list in `list.shift` (#27628) - Optimise `json_decode` Datetime string parsing (#27559) - Speed up `to_numpy` C-order via cache-blocked transpose (#27522) - Optimize `select(len())` for non-strict horizontal concat (#27516) - Pushdown slices to inputs on left/right/full join (#27508) - Don't infer CSV schema if schema is set (#27507) - Nested common subplan elimination (#27340) - Make `is_in` row-group pruning precise on null-containing haystacks (#27495) - Don't do fused-multiply-add on scalars (#27479) - List full fast path (#27477) - Make `is_in` row-group pruning precise on multi-value lists (#27475) - Add streaming GatherNode (#27465) - Lower non-elementwise FunctionExprIR to ColumnarFunctionNode (#27462) - Speed up parquet metadata decode with hand-written Thrift (#27427) ##### ✨ Enhancements - Use true division for the `/` operator in Polars SQL (#27391) - Add Rust backend for Expr.has\_nulls (#27590) - Stabilize float16 (#27607) - Add Expr.is\_empty (#27583) - Add support for the SQL `FILTER` clause for aggregate functions, and `STRING_AGG` (#27564) - Make parquet `FileMetadata` prunable for IR-plan dispatch (#27535) - Broadcast scalar input for `list.slice` (#27487) - Add LazyFrame.gather (#27501) - Add `null_on_oob` in {Expr/Series}.gather (#27327) - Stabilize streaming engine (#27497) - Process batched `arr.eval` on overflow boundaries (#27496) - Process batched `list.eval` on overflow boundaries (#27483) - Print `SLICED UNION` in LazyFrame explain (#27467) ##### 🐞 Bug fixes - Panic in scan of empty IPC with slice (#27708) - Persist object\_store rebuild state in cache (#27707) - Sort flag on GroupsType only applies to first element (#27684) - Invalid unwrap\_unchecked when length isn't exact (#27685) - Don't unwrap channel send in streaming join\_asof (#27688) - Fix `merge_sorted` panic when List in frame (#27568) - Put AsOf join buffered Morsels back the front of the deque if we cannot process them rn (#27658) - Fix skip\_batches logic for NaN (#27673) - Raise `TypeError` when calling `next()` directly on `GroupBy` objects (#27562) - Data type comparison for extension types (#27632) - Share last-morsel split budget across files in streaming multi-scan (#27630) - Bytes scalars were not being broadcast in dataframe constructor (#27621) - Reset the sort-options in `Series::is_sorted()` after row-encoding columns (#27614) - Rayon deadlock with re-entrant io sources (#27600) - Don't push negative-offset slices through `HConcat` (#27570) - Logic error in streaming is\_empty (#27602) - Fix incorrect CSE with large is\_in literal (#27575) - AnonymousFunction can qualify as SQL aggregator (#26986) - Fix CSPE panic in cloud (#27594) - Set merge-join streaming node to `Finished` if its sending port is `Done` (#27572) - Widen decimal precision on sum aggregation at runtime (#27579) - Fix `str.to_time` was raising unnecessarily when input was all nulls (#27574) - Prevent panic when switching from one extension dtype to another (#27566) - Fix `DataFrame.write_database(..., if_table_exists="append", engine="adbc")` not handling missing tables correctly (#26913) - Ensure `json_decode` doesn't fail for Date and Time string deserialization (#27554) - Incorrect RUSTFLAGS passing in Makefile (#27555) - Fix panic on reading IPC with 0-row compressed bitmap (#27551) - Set HEAD\_RESPONSE\_SIZE\_ESTIMATE to 0 (#27548) - Fix lazy concat horizontal didn' _[Truncated at 4000 characters — full notes: https://github.com/pola-rs/polars/releases/tag/py-1.41.0]_