# Polars 1.31.0 — Python Polars 1.31.0 - Product: Polars (https://whatsnew.fyi/product/polars) - Vendor: Polars - Date: 2025-06-18 - Version: 1.31.0 - Original notes: https://github.com/pola-rs/polars/releases/tag/py-1.31.0 - Permalink: https://whatsnew.fyi/product/polars/releases/1.31.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'. --- - **removed** — Remove old streaming engine - **deprecated** — Deprecate `allow_missing_columns` in `scan_parquet` in favor of `missing_columns` - **added** — Add DataType expressions in Python - **added** — Add native implementation for Iceberg positional deletes - **added** — Add `required: bool` to `ParquetFieldOverwrites` - **added** — Add `keys` column in `finish_callback` - **added** — Add `extra_columns` parameter to `scan_parquet` - **added** — Add CORR function to polars SQL - **added** — Add per partition sort and finish callback to sinks - **added** — Support descendingly-sorted values in search_sorted() - **added** — Add `include_nulls` to `Agg::Count` CSE check - **added** — Add {top, bottom}_k_by to Series - **changed** — Support serializing `name.map_fields` - **changed** — Support serializing `Expr::RenameAlias` - **changed** — Derive DSL schema - **fixed** — Remove axis in `show_graph` - **fixed** — Remove axis ticks in `show_graph` - **fixed** — Fix panic reading empty parquet with multiple boolean columns - **fixed** — Raise ComputeError instead of panicking in `truncate` when mixing month/week/day/sub-daily units - **fixed** — Materialize `list.eval` with unknown type ##### 💥 Breaking changes - Remove old streaming engine (#23103) ##### ⚠️ Deprecations - Deprecate `allow_missing_columns` in `scan_parquet` in favor of `missing_columns` (#22784) ##### 🚀 Performance improvements - Improve streaming groupby CSE (#23092) - Move row index materialization in post-apply to occur after slicing (#22995) - Add first\_(true|false)\_idx to BooleanChunked and use in bool arg\_(min|max) (#22907) - Don't go through row encoding for most types on `index_of` (#22903) - Optimise low-level `null` scans and `arg_max` for bools (when chunked) (#22897) - Optimize multiscan performance (#22886) ##### ✨ Enhancements - DataType expressions in Python (#23167) - Native implementation for Iceberg positional deletes (#23091) - Remove old streaming engine (#23103) - Basic implementation of `DataTypeExpr` in Rust DSL (#23049) - Add `required: bool` to `ParquetFieldOverwrites` (#23013) - Support serializing `name.map_fields` (#22997) - Support serializing `Expr::RenameAlias` (#22988) - Remove duplicate verbose logging from `FetchedCredentialsCache` (#22973) - Add `keys` column in `finish_callback` (#22968) - Add `extra_columns` parameter to `scan_parquet` (#22699) - Add CORR function to polars SQL (#22690) - Add per partition sort and finish callback to sinks (#22789) - Support descendingly-sorted values in search\_sorted() (#22825) - Derive DSL schema (#22866) ##### 🐞 Bug fixes - Remove axis in `show_graph` (#23218) - Remove axis ticks in `show_graph` (#23210) - Restrict custom `aggregate_function` in `pivot` to `pl.element()` (#23155) - Don't leak `SourceToken` in in-memory sink linearize (#23201) - Fix panic reading empty parquet with multiple boolean columns (#23159) - Raise ComputeError instead of panicking in `truncate` when mixing month/week/day/sub-daily units (#23176) - Materialize `list.eval` with unknown type (#23186) - Only set sorting flag for 1st column with PQ SortingColumns (#23184) - Typo in AExprBuilder (#23171) - Null return from var/std on scalar column (#23158) - Support Datetime broadcast in `list.concat` (#23137) - Ensure projection pushdown maintains right table schema (#22603) - Add Null dtype support to arg\_sort\_by (#23107) - Raise error by default on invalid CSV quotes (#22876) - Fix group\_by mean and median returning all nulls for Decimal dtype (#23093) - Fix hive partition pruning not filtering out `__HIVE_DEFAULT_PARTITION__` (#23074) - Fix `AssertionError` when using `scan_delta()` on AWS with `storage_options` (#23076) - Fix deadlock on `collect(background=True)` / `collect_concurrently()` (#23075) - Incorrect null count in rolling\_min/max (#23073) - Preserve `file://` in LazyFrame node traverser (#23072) - Respect column order in `register_io_source` schema (#23057) - Don't call unnest for objects implementing `__arrow_c_array__` (#23069) - Incorrect output when using `sort` with `group_by` and `cum_sum` (#23001) - Implement owned arithmetic for Int128 (#23055) - Do not schema-match structs with different field counts (#23018) - Fix confusing error message on duplicate row\_index (#23043) - Add `include_nulls` to `Agg::Count` CSE check (#23032) - View buffer exceeding 2^32 - 1 bytes in concatenate\_view (#23017) - Fix incorrect result selecting `pl.len()` from `scan_csv` with `skip_lines` (#22949) - Allow for IO plugins with reordered columns in streaming (#22987) - Method `str.zfill` was inconsistent with Python and pandas when string contained leading '+' (#22985) - Integer underflow in `propagate_nulls` (#22986) - Setting `compat_level=0` for `sink_ipc` (#22960) - Narrow return type for `DataType.is_`, improve Pyright's type completeness from 69% to 95% (#22962) - Support arrow Decimal32 and Decimal64 types (#22954) - Guard against dictionaries being passed to projection keywords (#22928) - Update arrow format (#22941) - Fix filter pushdown to IO plugins (#22910) - Improve numeric stability rolling\_mean\ (#22944) - Guard against invalid nested objects in 'map\_eleme _[Truncated at 4000 characters — full notes: https://github.com/pola-rs/polars/releases/tag/py-1.31.0]_