# Polars 1.20.0 — Python Polars 1.20.0 - Product: Polars (https://whatsnew.fyi/product/polars) - Vendor: Polars - Date: 2025-01-16 - Version: 1.20.0 - Original notes: https://github.com/pola-rs/polars/releases/tag/py-1.20.0 - Permalink: https://whatsnew.fyi/product/polars/releases/1.20.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'. --- - **deprecated** — Make parameter of str.to_decimal keyword-only - **added** — Add SQL support for the NORMALIZE string function - **added** — Add 'allow_exact_matches' parameter to join_asof - **added** — Add new-streaming first/last aggregations - **added** — Add Parquet Sink to new streaming engine - **added** — Add str.normalize() function - **added** — Support loading Excel Table objects by name - **added** — Support writing to file objects from write_excel - **added** — Support writing partitioned parquet to cloud - **added** — Add index_of() function to Series and Expr - **added** — Add cat.starts_with and cat.ends_with functions - **changed** — Allow different python versions for pickle - **changed** — Make automatic use of Azure storage account keys opt-in - **changed** — Reduce scan_csv() memory usage when using BytesIO - **changed** — Allow more group_by agg expressions in the new streaming engine - **changed** — Update sqlparser-rs, enabling LEFT keyword to be optional for anti/semi joins in SQL queries - **changed** — Officially support Python 3.13 - **fixed** — Fix unique(maintain_order=True) raising InvalidOperationError for null array - **fixed** — Fix incorrect top-k by sorted column and head() returning extra rows - **fixed** — Fix join_asof panicking for invalid tolerance input - **fixed** — Fix Int128 dtype serialization - **fixed** — Ensure SQL LIKE and ILIKE operators support multi-line matches ##### ⚠️ Deprecations - Make parameter of `str.to_decimal` keyword-only (#20570) ##### 🚀 Performance improvements - Extend functionality on BitmapBuilder and use in Growables (#20754) - Specialize first/last agg for simple types in new-streaming engine (#20728) - Use PyO3 to convert between Python and Rust datetimes (#20660) - Improve state caching and parallelism of window functions (#20689) - Broadcast without materialization in `concat_arr` (#20681) - Cache rolling groups (#20675) - Use downcast\_ref instead of dtype equality in `>` (#20664) - Fix performance regression for DataFrame serialization/pickling (#20641) - Make Parquet `verify_dict_indices` SIMD (#20623) - Move to `zlib-rs` by default and use `zstd::with_buffer` (#20614) - Skip filter expansion in eager (#20586) - Improve unique pred-pd (#20569) ##### ✨ Enhancements - Allow different python versions for pickle (#20740) - Add SQL support for the `NORMALIZE` string function (#20705) - Add 'allow\_exact\_matches' join\_asof' (#20723) - Add new-streaming first/last aggregations (#20716) - Add Parquet Sink to new streaming engine (#20690) - Make automatic use of Azure storage account keys opt-in (#20652) - Reduce scan\_csv() (and friends') memory usage when using BytesIO (#20649) - Improve `GroupsProxy/GroupsPosition` to be sliceable and cheaply cloneable (#20673) - Add `str.normalize()` (#20483) - Allow more group\_by agg expressions in the new streaming engine (#20663) - Support loading Excel Table objects by name (#20654) - Support writing to file objects from `write_excel` (#20638) - Raise `DuplicateError` if given a pyarrow Table object with duplicate column names (#20624) - Support writing partitioned parquet to cloud (#20590) - Add hint to error message for extra struct field in JSON (#20612) - Add `index_of()` function to `Series` and `Expr` (#19894) - Update `sqlparser-rs`, enabling "LEFT" keyword to be optional for anti/semi joins in SQL queries (#20576) - Add `cat.starts_with`/`cat.ends_with` (#20257) ##### 🐞 Bug fixes - Avoid blocking on async runtime when resolving cloud scans (#20750) - Fix `allow_invalid_certificates` being ignored in `storage_options` (#20744) - Incorrect output type for `map_groups` returning all-NULL column (#20743) - Fix `unique(maintain_order=True)` raising `InvalidOperationError` for null array (#20737) - Don't collapse into a Nested Loop Join if the cross join maintains order (#20729) - Don't serialize credentials provider (#20741) - Fix `Series.n_unique` raising for list of struct (#20724) - Fix incorrect top-k by sorted column, fix `head()` returning extra rows (#20722) - Add outer validity to AnyValueBufferTrusted for structs (#20713) - Don't partition group-by with non-scalar literals in agg (#20704) - Fix xor operation of selector with Expr (#20702) - Incorrect view buffer dedup (#20691) - Only verify Parquet ConvertedType if no LogicalType is given (#20682) - Validate length of `schema_overrides` in `read_csv` (#20672) - Fix `map_elements` ignoring `skip_nulls=True` for struct dtype (#20668) - Check for MAP-GROUPS in cloud-eligible (#20662) - Fix empty output of `to_arrow()` on filtered unit height DataFrame (#20656) - Add `.default` to azure credential provider scope URL (#20651) - Fix `join_asof` panicking for invalid `tolerance` input (#20643) - Incorrect flag check on is\_elementwise (#20646) - Don't panic but set null type if type is unknown (#20647) - Fix performance regression for DataFrame serialization/pickling (#20641) - Fix `Int128` dtype serialization (#20629) - Ensure `read_excel` and `read_ods` support reading from raw `bytes` for all engines (#20636) - Ensure that SQL `LIKE` and `ILIKE` operators support multi-line matches (#20613) - Properly broadcast in sort\_by (#20434) - Properly load nested Parquet Statistics (#20610) - AWS environment config was not loaded when credential provider was used (#20611) - Fix order observability of group-by-dyn (#20615) - Sou _[Truncated at 4000 characters — full notes: https://github.com/pola-rs/polars/releases/tag/py-1.20.0]_