NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #449 most downloaded on PyPI
Blazingly fast DataFrame library
Last release 14 days ago
20 Sep 2026
Ships fairly regularly
a new release about every 4 weeks
Nearly every release is documented
notes for 18 of 19 stable releases
11 versions withdrawn
withdrawn after publishing
1 years old
36 releases · first in 2025
One column per month.
Read Parquet ENUM type as pl.String
Map dtype (#28984)scan_lines (#29310)CloudScheme::Http sources (#29284)sort_in_place (#29343)posix_fadv to Normal (#29157)mmap with file I/O for parquet scan (#29091)head requests (#29131)scan_fn.io_source (#28897)join keys (#29233)APPROX_QUANTILE to the SQL frontend (#29288)approx_quantile in the streaming engine (#29237)scan_iceberg/delta-related attributes in the visitor for cudf_polars (#29297)collect and collect_batches using RemoteEngine (#28914)String to Time (#29215)organization to Config.enable_monitoring (#29221)Map dtype (#28984)read_database for Arrow-based drivers (#29273)Date and Decimal means between the streaming and in-memory engines (#29359)Struct supertypes per-field (#29261)auto (#29236)Wildcard selector (#29220)AnyValues through their field dtypes (#29185)OVER clause to multi-argument aggregates (#29160)DataFrame construction race (and generator data loss) (#29132)read_database Oracle regression, following introduction of Arrow fast-path (#29142)Decimal true division with integers (#29122)exp/log1p on non-numeric dtypes (#29112)offset_by when target date is out-of-range (#29059)is_empty/ has_nulls (#29152)fast-release profile without LTO (#29168)0.23.45 (#29303)test_fused_many_morsels_and_skew test (#29290)SpillFrames in DataFrameSearchBuffers (#29207)MapChunked storage handling (#29248)lf.collect().schema == lf.collect_schema() check (#29224)object_store for new DnsResolver trait (#29145)map_elements (#24925)Thank you to all our contributors for making this release possible!
@0guban0v, @ATL2001, @Aidavdw, @AlessandroKuz, @BitWeaverDev, @DeflateAwning, @EndPositive, @Kevin-Patyk, @MarcoGorelli, @SatvikMishra08, @aarushkandukoori, @abokhalill, @alexander-beedie, @atharva7905k, @ayushh0110, @borchero, @carnarez, @dancsi, @dsprenkels, @freundTech, @fsimkovic, @jonasdedden, @kafka1991, @kdn36, @lun3x, @madsbk, @matthewbayer, @mikhail5555, @mroeschke, @nameexhaustion, @orlp, @r-brink and @ritchie46
Python Polars 2.0.0-rc.2 Pre-release
Pre-release
Compare
Set the default engine for SQL to the streaming engine
meta namespace (#28091)Date feature gating (#29031)Series.sample order when with_replacement=True and shuffle=False (#28990)PostApplyExtraOps (#29049)combine_validities_and_many and add test (#28909)sink_batches lazy: Literal[False] overload a default (#28951)if for cfg(debug_assertions) to fix the benchmark job (#29002)Thank you to all our contributors for making this release possible!
@0guban0v, @0xC61, @Aniket-a14, @LarryHu0217, @MatteoPossamai, @NeejWeej, @TNieuwdorp, @WaterWhisperer, @adamreeve, @dsprenkels, @jonasdedden, @kdn36, @math-hiyoko, @matthewbayer, @nameexhaustion, @orlp, @ritchie46, @severinh and @sivakumar-mahalingam
Python Polars 2.0.0-rc.1 Pre-release
Pre-release
Compare
Thank you to all our contributors for making this release possible! @EndPositive , @dsprenkels , @kdn36 , @lun3x , @nameexhaustion and @orlp
Thank you to all our contributors for making this release possible!
@EndPositive, @dsprenkels, @kdn36, @lun3x, @nameexhaustion and @orlp
Thank you to all our contributors for making this release possible! @Kevin-Patyk , @henrytsanford , @jonasdedden , @orlp and @ritchie46
Thank you to all our contributors for making this release possible!
@Kevin-Patyk, @henrytsanford, @jonasdedden, @orlp and @ritchie46
Deprecate rechunk parameter for all read/scan functions
rechunk parameter for all read/scan functions (#28063)Expr.rechunk() (#28692)struct.rename_fields() with an incorrect number of fields (#28672)CloudRetryConfig for rate limit stability (#28885)mask for DataFrame filter (#28762)Partial metadata on filter (#28737)join_where (#28880)RemoteEngine and a common base class for all engines (#28800)scan_iceberg (#28772)sinked_paths_callback on sink_parquet as unstable parameter (#28814)infer_schema_files to CSV inference hint (#28809)struct.drop() (#28666)unpivot column selection aligns with the lazy engine (#28846)select() height (#28751)monitoring as an engine-level parameter (#28821)min and max (#28789)any and all (#28754)by column values in rolling_*_by (#27367)field in struct.with_fields with over (#28678)Utf8 and Binary (#28662)__arrow_c_stream__ (#28642)LargeList (#28632)read_database_uri requirements for SQLAlchemy (#28366)monitoring as an engine-level parameter (#28821)RemoteEngine and a common base class for all engines (#28800)CredentialProviderAWS and CredentialProviderAzure (#28790)ScanCastOptions (#27906)test_grouped_agg_parametric as slow (and add param ids) (#28715)expect in test_group_by_arg_max_boolean_26978 (#28690)struct.drop() in rename_fields() deprecation message (#28687)dist=loadgroup to the pytest config (#28676)may_fail_auto_streaming tests (#28675)test_extension() for streaming engine (#28611)test_hive_join_rewrite_semi_join test to work with streaming engine (#28610)Thank you to all our contributors for making this release possible!
@0guban0v, @JakubValtar, @Joosboy, @Kevin-Patyk, @MatteoPossamai, @NicoOhR, @TNieuwdorp, @VedantMadane, @aarushkandukoori, @alexander-beedie, @azimafroozeh, @borchero, @carnarez, @dancsi, @dependabot[bot], @dsprenkels, @gautamvarmadatla, @jonasdedden, @jorenham, @kdn36, @lzcmian, @malhotrashivam, @matthewbayer, @mikhail5555, @nameexhaustion, @orlp, @ritchie46, @subotac and dependabot[bot]
Deprecate casts from Categorical to integer dtypes
Categorical to integer dtypes (#28525)plan_stage argument in show_graph() (#28391)len() to concat/union inputs (#28570)from_arrow of ArrowStreamExportable (#28442)infer_schema_files parameter to scan_csv (#28440)Series(Array) (#28602)StringChunked substring kernels (#28573)Unknown(Int) and Unknown(Float) should result in Unknown(Float) (#28545)nulls_last after Expr.reverse() (#28572)SQLContext.execute() (#28549)nulls_last in function_expr_sortedness (#28544)Thank you to all our contributors for making this release possible!
@BitWeaverDev, @Matt711, @Samoilov2004, @borchero, @dancsi, @dsprenkels, @kdn36, @masumi-ryugo, @nameexhaustion and @ritchie46
Optimize not(bool_f) to not_bool_f
NOT IN interaction with NULL values and joins (#28484)SUM and CORR aggregates return NULL for all-null inputs, add TOTAL (#28475)null_count_dtype helper between Delta and Iceberg, fixing SchemaError (#28479)ruff and mypy package versions (#28456)Thank you to all our contributors for making this release possible!
@AnirudhRahul, @EndPositive, @Jesse-Bakker, @alexander-beedie, @carnarez, @dancsi, @mdroogh, @mroeschke, @nameexhaustion, @nchammas, @orlp, @r-brink and @ritchie46
Deprecate casting numeric types to categoricals
cat.get_categories() and cat.to_local() (#28299)LazyFrame.profile() (#28275)list/arr.to_struct() calls that don't pass field names (#28243)missing_utf8_is_empty_string to empty_string_is_null (#28173)full_null() with small lengths (#28181)scan_arrow_c_stream (#28340)initial-default in native scan_iceberg (#28324)assert_frame_equal error (#27816)list expression which consistently packs elements together into new List type (#27990)read_database Arrow fast-path for "python-oracledb" (#28230)CastColumnsPolicy (#28084)dt.replace when there were multiple chunks (#28437)is_scalar from the input to the output of .sort() and .sort_by() (#28438)sort().reverse() to sort(descending=True) when maintain_order=True (#28403)write_json() null values in Array columns being written incorrectly as null (#28330)select(len()) (#28355)top_k/bottom_k (#28359)aws_checksum_algorithm when provided (#28328)pyarrow.feather.read_table (#28323)Object dtype instead of creating invalid List(Object) (#28246)ewm_var/ewm_std value (#28235)ADBC shouldn't require "CREATE" privileges unless the table is confirmed not to exist (#28228)rolling_rank position invalid if ost.len() < min_samples (#28142)merge_sorted() docs also for DataFrame (#28183)merge_sorted() null inputs should be nulls first (#28177)dev profile to line-tables-only (#28358)shuffle parameter for sample() (#27460)to_struct() in doctest (#28370)spin dependency to v0.10.1 (#28360)assert_frame_equal error (#27816)optimize (#28318)object_store custom DNS resolver patch to rev-based (#28241)*GroupBy (#27903)classinstmethod and attribute annotation (#27904)typos to v1.48.0 (#28162)Thank you to all our contributors for making this release possible!
@0guban0v, @AnirudhRahul, @Bharath-970, @CodingSelim, @EndPositive, @Jesse-Bakker, @Kevin-Patyk, @LarryHu0217, @MarcoGorelli, @MatteoPossamai, @TNieuwdorp, @alex-h-sun, @alexander-beedie, @azimafroozeh, @borchero, @dancsi, @dependabot[bot], @dsprenkels, @harrywhalen, @jorenham, @kdn36, @makinzm, @malhotrashivam, @mdavis-xyz, @mikhail5555, @mkzung, @mroeschke, @nameexhaustion, @orlp, @r-brink, @raphaelroshan, @ritchie46, @tylerriccio33, @useredsa, @wence-, @yannbolliger, @zichen0116 and dependabot[bot]
Deprecate strict parameter of pl.concat, replace with new how='horizontal_extend'
strict parameter of pl.concat, replace with new how='horizontal_extend' (#27965)select(len()) after groupby (#28108)ResourceWarning leaks in database/iceberg tests (#28107)DeferredRefreshableCredentials (#28099)replace when old/new contain Expr or object dtype values (#27433)tokio::spawn in clippy (#28123)Makefile with respect to venv robustness (#28110)pd.TimeDelta segfault (#28125)mypy to the new 2.x release (#28116)pyrefly checks run as part of make pre-commit (#28095)test_select_explode_height_filter_order_by failure when POLARS_MAX_THREADS=2 (#28090)Thank you to all our contributors for making this release possible! @0guban0v, @Kevin-Patyk, @TNieuwdorp, @alexander-beedie, @azimafroozeh, @dsprenkels, @kdn36, @nameexhaustion, @orlp, @raphaelroshan, @ritchie46 and @sar-cheng
Deprecate casts from string to temporal dtypes
JOIN syntax (#27890)Expr.is_sorted (#26708)DataFrame.is_sorted() (#27870).explode() without empty_as_null argument (#28040)select(len()) incorrectly returned 0 when using scan_iceberg with pyiceberg as reader override (#28044)sink_* functions (#28042)dt.truncate and dt.round (#26120)file:// URIs with percent-encoded paths (#27876)[NOT] IN (subquery) to semi/anti join (#27888)sort.reverse() into single sort (#27918)eol_char docstrings (#27962)DataFrame.is_sorted() (#27913)sqlparser dependency (#28021)pyo3 and rust-numpy to 0.29.0 (#27970)2.0 branch as primary branch (#27978)deny.toml configuration (#27949)Vec instead of PlHashMap for ProjectionInfo.map (#27856)codegen-units (#27835)unbound-name Pyright/Pyrefly errors (#27827)Thank you to all our contributors for making this release possible! @0guban0v, @April-Sonnet, @BitWeaverDev, @EndPositive, @JakubValtar, @Kevin-Patyk, @Liyixin95, @MarcoGorelli, @Matt711, @TNieuwdorp, @alexander-beedie, @ankane, @azimafroozeh, @cBournhonesque, @carnarez, @dsprenkels, @gautamvarmadatla, @kdn36, @nameexhaustion, @orlp, @ritchie46, @tolleybot, @toreerdmann, @uurl and @xixixao
Do not materialize ScalarColumn in Column split_at
ScalarColumn in Column split_at (#27782)array.shift (#27740)list.sample(n) and list.sample(frac) (#27679)_utils and functions (#27789)Thank you to all our contributors for making this release possible! @ButteryPaws, @EndPositive, @Kevin-Patyk, @MarcoGorelli, @TNieuwdorp, @azimafroozeh, @carnarez, @kdn36, @lun3x, @orlp and @ritchie46
Adaptive size dispatch to hashset or radix sort + capacity-aware reset in agg_n_unique
agg_n_unique (#27719)sort_by in group_by (#27772)POLARS_ALLOW_NESTED_CSPE env var and make nested CSPE opt-in (#27765)credentialprovider cache key (#27712)merge_sorted docs that the input must be nulls first (#27743)merge_sorted docs that the input must be nulls first (#27743)CatalogCredentialProvider (#27739)type: ignore in _AioDataFrameResult (#27311)_write_utils.py (#27721)not isinstance(v, DataType) check (#27723)Thank you to all our contributors for making this release possible! @EndPositive, @JakubValtar, @MarcoGorelli, @NicoOhR, @azimafroozeh, @carnarez, @dsprenkels, @jorenham, @kdn36, @nameexhaustion, @orlp and @ritchie46
Nested common subplan elimination
{list,arr}.{unique,n_unique,reverse} to group_by engine (#27278)list.shift (#27628)json_decode Datetime string parsing (#27559)to_numpy C-order via cache-blocked transpose (#27522)select(len()) for non-strict horizontal concat (#27516)is_in row-group pruning precise on null-containing haystacks (#27495)is_in row-group pruning precise on multi-value lists (#27475)/ operator in Polars SQL (#27391)FILTER clause for aggregate functions, and STRING_AGG (#27564)FileMetadata prunable for IR-plan dispatch (#27535)list.slice (#27487)null_on_oob in {Expr/Series}.gather (#27327)arr.eval on overflow boundaries (#27496)list.eval on overflow boundaries (#27483)SLICED UNION in LazyFrame explain (#27467)merge_sorted panic when List in frame (#27568)TypeError when calling next() directly on GroupBy objects (#27562)Series::is_sorted() after row-encoding columns (#27614)HConcat (#27570)Finished if its sending port is Done (#27572)str.to_time was raising unnecessarily when input was all nulls (#27574)DataFrame.write_database(..., if_table_exists="append", engine="adbc") not handling missing tables correctly (#26913)json_decode doesn't fail for Date and Time string deserialization (#27554)suffix="" and coalesce=True (#27376)FastCount for csv if pre_slice is set (#27536)over (#27544)Sequence[int] from DataFrame.\_\_setitem\_\_ key (#27355)nulls_last for descending over(order_by) in group_by().agg() (#27486)scan_csv select(len()) when collected on streaming engine (#27504)to_arrow() in a multithreaded context (#27472)to_pandas() in multithreaded context (#27451)read_parquet/read_csv with pyarrow reader (#27397)sample() respects shuffle=False (#27248)DataFrame from concat_list with lit and empty column (#27305)MAP columns without LogicalType annotation (#27404)DuplicateError on parquet files with duplicate column names (#27399)join_asof docstring (#27682)engine options on LazyFrame collect/sink/explain methods (#27374)over:order_by description (#27520)write_ipc buffer behavior with file=None (#27430)allow_local_scans option for prepare_cloud_plan (#27663)deltalake and fix CI (#27660)impl IntoAExprBuilder for ExprIR (#27656)_expand_selector_dicts into multiple functions so return type is simple and accurate (#27618)DataFrame.__array__ and Series.__array__ (#27634)type: ignore statements (#27360)PhysNodeKind::AsOfJoin::{left_right}_by fields (#27400)udfs.py (#27341)Thank you to all our contributors for making this release possible! @0guban0v, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @Liyixin95, @MarcoGorelli, @NedJWestern, @Shoeboxam, @SuryaSunil1326, @TNieuwdorp, @alexander-beedie, @aryansri05, @ashler-herrick, @azimafroozeh, @carnarez, @coastalwhite, @dependabot[bot], @dsprenkels, @gab23r, @gautamvarmadatla, @ilya-pevzner, @jonathansergio, @junnythemarksman, @kdn36, @lun3x, @nameexhaustion, @orlp, @pablogsal, @ritchie46, @uurl, @waamm, @wence-, @wmoss, @xronocode and dependabot[bot]
Skip validity mask processing in \_\_array\_ufunc\_\_ when no inputs have nulls
maintain_order parameter to merge_sorted (#27263)having predicate in GroupBy iter (#27370)NumUnorderedImplodeReducer arrow ListArray (#27375)reduce_balanced for certain input length lists affecting pl.concat (#27352)list.sample() allows fraction > 1 when with_replacement=True (#27350)append() errors when upcast=False (#27346)DataFrame.__init__ and Series.__init__ so they don't require all optional dependencies to be installed (#27348)pyarrow calls (#27377)Thank you to all our contributors for making this release possible! @EndPositive, @Kevin-Patyk, @MarcoGorelli, @carnarez, @dsprenkels, @gab23r, @jonathanchang31, @kdn36, @mzjp2 and @ritchie46
Deprecate support for dataframe interchange protocol
drop_{nulls,nans} in streaming group_by aggregations (#27296)entropy to streaming reductions (#27174)interpolate (#27185)strptime with format=None (#27056)skew / kurtosis to streaming aggregations (#27176)drop_nulls().{first,last}() to {first,last}(ignore_nulls=True) (#27187)cut output Enum and mark as elementwise (#27173)cov and corr (#27008)maintain_order=True requirement in sink_delta (#27007)ignore_nulls to {list,arr}.{any,all} (#27186)is_unique to list/array dtypes (#27290)pl.merge_sorted operating on multiple frames (#27014)group_by() without key exprs (#27141)groups to correct length for Implode (#27282)pl.int_ranges (#27294)pivot dropping data for null on values (#27273)LazyFrame.map_batches to no optimizations (#27262)StructEval schema context in StackOptimizer (#27243)Series to Struct (#27241)scan_delta filter on empty dataframe (#27244)DataFrame creation panic on list[struct] with heterogenous types (#27217)__structify was being ignored (#27148)null group entries when collecting AsOf-by groups (#27215)sink_parquet (#27196)Binary arg_min/arg_max and String single-element arg indices (#27172)int96_to_i64_ns to prevent overflow panic (#27129)from_epoch scaling (#27118)clip when the Series bound contains nulls (#27087)ddof parameter in rolling_corr and deprecate (#27104)sql_expr (#27084)COUNT(<lit>) expressions return the correct value (#27085)test_group_by_arg_max_boolean_26978 non-flaky for max_by ties (#27048)transpose() with mixed List and non-List columns (#27038)src/ subdirectory to CI Python docs step (#27025)merge_sorted and union (#27018)pl.DataFrame.fill_null work on columns with Null dtype (#27020)set_sorted in projection pushdown (#27006)agg_arg_min/agg_arg_max for boolean data type (#26997)sample() respects the global set seed (#26992)LazyGroupBy.map_groups docstring (#27292)deny_anonymous_users to scheduler config (#27287)merge_sorted (#27224)Series docstring whitespace indents (#27082)write_parquet docstring for use_pyarrow (#26988)scan_ipc cache arguments as deprecated (#27216)test_dtype_concat_3735 not actually iterating through numeric dtypes (#27178)test_scan_lines (#27213)_balanced_reduce to Python utils (#27100)ty / pyrefly (#27050)ResourceWarning coverage (#27083)src/ subdirectory to CI Python docs step (#27025)POLARS_AUTO_NEW_STREAMING=1 (#26818)Thank you to all our contributors for making this release possible! @0xRozier, @EndPositive, @HCYT, @Kevin-Patyk, @MarcoGorelli, @NeejWeej, @RedZapdos123, @TNieuwdorp, @abhidotsh, @alexander-beedie, @andyjessen, @azimafroozeh, @borchero, @carnarez, @coastalwhite, @debnathshoham, @dpinol, @dsprenkels, @dydev012, @farouk-01, @gab23r, @gautamvarmadatla, @joaquinhuigomez, @kdn36, @nameexhaustion, @orlp, @ritchie46, @wence-, @xenzh, @yangsong97 and @yonatan-genai
Thank you to all our contributors for making this release possible! @ritchie46
Thank you to all our contributors for making this release possible! @ritchie46
Thank you to all our contributors for making this release possible! @nameexhaustion and @ritchie46
Thank you to all our contributors for making this release possible! @nameexhaustion and @ritchie46
Ensure read_csv_batched() prints deprecation warning
arg_{min,max} to streaming engine (#26845)scan_csv (#26637)scan_ndjson / scan_lines (#26563)AsOf join node (#26398).collect_schema() when arr.get() is out-of-bounds (#26866)Expr.reinterpret to all numeric types of the same size (#26401){min,max}_by (#26849)ARRAY init from typed literals (#26622)scan_iceberg() (#26826)make fresh command to the Makefile (#26809)write_excel (#26699)LazyFrame.sink_iceberg (#26799)pl.from_repr (#26806)contains_dtype() method for Schema (#26661)truncate as a "to_zero" rounding mode (#26677)Alignment TypeAlias (#26668)truncate Expression for numeric values (#26666)LPAD and RPAD string functions (#26631)SELECT query syntax (#26598)base_type typing (#26602)%.3f/%.6f/%.9f specifiers (#26075)assert_schema_equal in py-polars (#24869)corr (#26588)scan_ndjson / scan_lines (#26563)cast_options for scan_parquet (#26492)sas_token in Azure credential provider (#26565)get() for binary Series (#26514)AsOf join node (#26398)FETCH clause (#26449)Boolean arithmetic with integer literals producing Unknown type in streaming engine (#26878)UInt128 series (#26886)group_by().map_groups() (#26707)dbc in DataFrame.write_database (#26157).collect_schema() when arr.get() is out-of-bounds (#26866)LazyFrame.__contains__ (#26734)map_columns function parameter (#26487)timedelta when multiplying with a Series (#26830)function parameter in DataFrame.map_columns (#26372)JoinExec on deep plan (#26796)over context (#26827){min,max}_by in streaming engine for Boolean full {min,max} value column (#26848){arg_,}_{min,max} for Categoricals (#26856)on_columns (#26852)rolling_cov() and rolling_corr() with mixed input types (#26820)group_by fallback (#26801)RowEncodingContext::Struct when determining D::Struct encoded item len (#26817)collect(engine='streaming') with POLARS_AUTO_NEW_STREAMING (#26792)pd.Timedelta (#26785){column_name} and {index} placeholders in pl.format string (#26771)nulls_last is unknown (#26778)rolling (#26724).get() is out-of-bounds in group by context (#26752)bitwise_xor aggregation inverted when column contains nulls (#26749)nulls_last in sort_by within group_by().agg() slow path (#26681)NaN when using corr() with a literal and expr (#26697)PoisonError panic caused by reentrant usage of file cache (#26627)strict=False (#26674)Enum struct slicing (#26643)SQLContext typing overloads (#26658)pl.from_epoch losing fractional seconds (#26419)to_pandas() on empty enum Series did not preserve enum dictionary (#26610)f32 values with "HalfAwayFromZero" mode (#26624)OVER clause (#26570)dictionary_page_offset when dictionary encoding is used and point data_page_offset to the first data page (#26542)read_csv_batched() prints deprecation warning (#26530)PhysicalExpr for MinBy/MaxBy nodes (#26506)TotalOrd (#26497)replace_strict() (#26453)null when dividing literals by 0 (#26343)EXTRACT and DATE_PART functions (#26575)get() for binary Series (#26514).gitignore and .typos.toml exclude "_polars_runtime*" directories (#26842)_expand_paths scan function (#26798)Expr sortedness container to AExprSorted and add nulls_last to PyExpr.set_sorted() (#26781)stop_and_buffer_pipe_contents into joins/utils.rs (#26810)is_supported_type macro with a closure in predicate_pushdown/join.rs (#26812)pl.all() expansion (#26773){read, scan}_ndjson cache argument(s) as deprecated (#26711)importlib (#26603)assert_schema_equal (#26596)__init__.py files and docstrings to testing directories (#26408)LazyFrame.clear to clear sql (#26562)process_except_intersect during IR (#26516)POLARS_IDEAL_MORSEL_SIZE=4 (#26420)test_file and have tests create test.parquet in tmp_path (#26525)s3fs dev dependency (#26509)rechunk() if not allow_chunks (#26504)RevMapping) (#26508)ruff, mypy, typos (#26476)execute_isolated (#26455)Thank you to all our contributors for making this release possible! @BJohnBraddock, @EndPositive, @Jesse-Bakker, @Kevin-Patyk, @MarcoGorelli, @Matt711, @NathanHu725, @RenzoMXD, @TNieuwdorp, @Voultapher, @WaffleLapkin, @abishop1990, @alexander-beedie, @azimafroozeh, @boris324, @cBournhonesque, @carnarez, @coastalwhite, @daizutabi, @dependabot[bot], @dsprenkels, @erandagan, @etiennebacher, @gautamvarmadatla, @henryharbeck, @hutch3232, @itamarst, @jberg5, @johalnes, @kdn36, @leudz, @lukas-reining, @moktamd, @mqqz, @mroeschke, @nameexhaustion, @orlp, @pragun-ananda, @qxzcode, @ritchie46, @spock-yh, @stakeswky, @tlauli, @toroleapinc, @veeceey and dependabot[bot]
Add get() to retrieve a byte from binary data
scan_delta with filter (#26448)by_name selector selects only names (#26437)POLARS_IDEAL_MORSEL_SIZE monkeypatching in the parametric merge-join test (#26418)selector match patterns for multiline column names (#26320)sink_delta to API reference (#26446)Expr::Display as catch all for IR - DSL asymmetry (#26471)POLARS_IDEAL_MORSEL_SIZE monkeypatching in the parametric merge-join test (#26418)Thank you to all our contributors for making this release possible! @Voultapher, @alexander-beedie, @azimafroozeh, @cmdlineluser, @dependabot[bot], @dsprenkels, @hamdanal, @kdn36, @nameexhaustion, @orlp, @ritchie46 and dependabot[bot]
Deprecate retries=n in favor of storage_options={"max_retries": n}
retries=n in favor of storage_options={"max_retries": n} (#26155)put upload for IPC sink (#26288)scan_delta to use python dataset interface (#26190)arg_max/arg_min (#26093)arrow_schema parameter to sink_parquet (#26323)put upload for IPC sink (#26288)upload_concurrency through env var (#26263)LazyFrame.group_by(...).map_groups (#26275){sink/scan}_ipc (#26254)storage_options (#26204)scan_lines (#26112)str.split (#26060)scan_ipc/sink_ipc (#26079)height parameter to DataFrame/LazyFrame (#26014)PartitionBy with scalar key expressions and diff() (#26370)with_columns and collect_all (#26366)is_in with inlinable needles (#26361)xlsx2csv version temporarily (#26352)read_ods and read_excel (#26317)Union typing (#26303)rolling_rank_by (#26287)is_count_star flag between queries in collect_all (#26256)pl.duration scalar arguments case (#26213)DataFrame.slice with negative offset and length=None (#26215)scan_csv with multiple files and skip_rows + n_rows larger than total row count (#26128)allow_object flag after cache (#26196)hash_rows() of 0-width DataFrame (#26154)with_row_index or unpivot create duplicate columns on a LazyFrame (#26107)Expr.get referencing incorrect dtype for index parameter (#26364)Expr.quantile formatting (#26351)sphinx-llms-txt extension (#26285)cublet_id (#26260)make requirements-all (#26195)from_torch if module not installed (#26405)Operator::Divide to RustDivide (#26339)xlsx2csv dependency pin (#26355)POLARS_PANIC_ON_ERR (#26125)unused-ignore mypy lint (#26110)file://hostname/path (#26061)Thank you to all our contributors for making this release possible! @Atarust, @EndPositive, @Kevin-Patyk, @LeeviLindgren, @MarcoGorelli, @Matt711, @MrAttoAttoAtto, @Voultapher, @WaffleLapkin, @agossard, @alex-gregory-ds, @alexander-beedie, @azimafroozeh, @bayoumi17m, @c-peters, @carnarez, @dependabot[bot], @dsprenkels, @hallmason17, @hamdanal, @ion-elgreco, @kdn36, @lun3x, @mcrumiller, @nameexhaustion, @orlp, @qxzcode, @r-brink, @ritchie46, @sweb and dependabot[bot]
Speed up SQL interface "UNION" clauses
SQL interface "UNION" clauses (#26039)Thank you to all our contributors for making this release possible! @Voultapher, @alexander-beedie, @kdn36, @nameexhaustion, @orlp, @ritchie46 and @wtn
Fix display of deprecation warning
SQL interface "ORDER BY" clauses (#26037)sink_* functions to new-streaming by default (#25910)scan_csv/ndjson (#25757)pl.PartitionBy API (#26004)COUNT(*) fast path (#25988)collect_all (#25991)JOIN columns that are ambiguous (#25761){sink,write}_ipc (#25958)null_on_oob parameter to expr.get (#25957)SQLContext recognition of possible table objects in the Python globals (#25749)sql method for API consistency (#25792)shift support for Object data type (#25769)Series.arr.mean (#25774)struct.with_fields data model coherent (#25610)group_by names in upsample() (#25811)DataFrame.estimated_size not handling overlapping chunks correctly (#25775)midpoint interpolation (#25824)list.eval (#25826)group_by incorrectly introduced NULLs on group key columns (#25794)collect_schema for unpivot followed by join (#25782)arr namespace is called from array column (#25650)LazyFrame.serialize() unchanged after collect_schema() (#25780)rank (#25887)QUALIFY clause and SUBSTRING function to the SQL docs (#25779)lazy parameter to collect_all as unstable (#25999)ruff action and simplify version handling (#25940)scan_csv/ndjson (#25757)Thank you to all our contributors for making this release possible! @AndreaBozzo, @EndPositive, @Kevin-Patyk, @MarcoGorelli, @Voultapher, @alexander-beedie, @anosrepenilno, @arlyon, @azimafroozeh, @carnarez, @dependabot[bot], @dsprenkels, @edizeqiri, @eitanf, @gab23r, @henryharbeck, @hutch3232, @ion-elgreco, @jqnatividad, @kdn36, @lun3x, @m1guelperez, @mcrumiller, @nameexhaustion, @orlp, @ritchie46, @sachinn854, @yonikremer and dependabot[bot]
Tune partitioned sink\_parquet cloud performance
Object literal (#25690)boto3 extra from s3fs in dev requirements (#25667)bin_slice, bin_head, and bin_tail (#25697)drop_first in to_dummies when nulls present (#25435)how options in join() docstrings (#25678)lit fix earlier in the function (#25713)boto3 extra from s3fs in dev requirements (#25667)sqlparser-rs (#25673)Thank you to all our contributors for making this release possible! @AndreaBozzo, @Kevin-Patyk, @alexander-beedie, @dsprenkels, @jamesfricker, @mcrumiller, @nameexhaustion, @orlp and @ritchie46
Don't trigger DeprecationWarning from SQL "IN" constraints that use subqueries
🏆 Highlights
Schema.to_arrow() (#25149)JOIN constraints (#25132)Expr.rolling index_column (#25117)ewm_var/std in streaming engine (#25109)IR::Scan to IR::DataFrameScan in expand_datasets when applicable (#25106)unique frame method (#25099)BIT_NOT support to the SQL interface (#25094){Expr,LazyFrame}.rolling (#25058)LEAD and LAG functions (#23956)take_unchecked_impl (#25672){forward,backward}_fill in group-by contexts (#25115)ColumnPredicates generation for inequalities operating on integer columns (#25412)float Series (#25323)PyExpr to PyObject conversion (#25265)format_str in case of multiple chunks (#25162)pl.col.<colname> edge-cases (#25153)group_by iterator (#25138)dt.truncate for invalid duration strings (#25124)DeprecationWarning from SQL "IN" constraints that use subqueries (#25111)Expr reprs (#25101)groups update on slices with different offsets (#25097)select(len()) off by 1 with comment prefix (#25069)LazyFrame.remote signature (#25175)replace_all reference in replace docs (#25161)and_, or_, and not_ Expressions on integer columns (#25092)pl.format on multiple chunks (#25164)make fmt and make lint commands (#25200)proptest AnyValue strategies (#25510)proptest strategies for Series nested types (#25220)ruff and typos and made the necessary lint updates (#25196)proptest strategies for Series logical types (#24849)arg_sort() and Writeable::as_buffered() (#25583)parallelize_first_to_local (#25563)URL_ENCODE_CHARSET to HIVE_ENCODE_CHARSET (#25554)sync parameter in Writeable::close() (#25475)&dyn Any instead of Box<dyn Any> in python object converters (#25421)pipe_with_schema (#25388)pipe_with_schema work on Arced schema (#25155)scan_lines (#25136)optimization_toggle (#25130)scan_lines (#25066)EwmCov kernel (#25065)EwmMeanState to polars-compute (#25034)tolerance type coercion to IR conversion (#25033)date_range and related functions (#24084)Thank you to all our contributors for making this release possible! @AndreaBozzo, @DannyStoll1, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @MarcoGorelli, @TNieuwdorp, @Voultapher, @alexander-beedie, @borchero, @c-peters, @cBournhonesque, @camriddell, @carnarez, @cmdlineluser, @coastalwhite, @cr7pt0gr4ph7, @davanstrien, @davidia, @dsprenkels, @etiennebacher, @feliblo, @guilhem-dvr, @itamarst, @jannickj, @jetuk, @kdn36, @lun3x, @marinegor, @mcrumiller, @nameexhaustion, @orlp, @pomo-mondreganto, @ritchie46, @vyasr, @wtn, and more!
Don't trigger DeprecationWarning from SQL "IN" constraints that use subqueries
ROW_NUMBER, RANK, and DENSE_RANK functions (#25409)WINDOW references (#25400)BIT_NOT support to the SQL interface (#25094)LazyFrame.pivot (#25016)allow_empty flag to item (#25048)empty_as_null and keep_nulls flags to Expr.explode (#25289)empty_as_null and keep_nulls to {Lazy,Data}Frame.explode (#25369)having to group_by context (#23550)ignore_nulls to first / last (#25105)maintain_order to Expr.mode (#25377)quantile for missing temporals (#25464)str.replace_many / str.find_many / str.extract_many (#25398)Float16 dtype (#25185)Schema.to_arrow (#25149)Expr.rolling in aggregation contexts (#25258)Expr.unique on List/Array with non-numeric types (#25285)glimpse to return a DataFrame (#24803)hash for all List dtypes (#25372)implode and aggregation in aggregation context (#25357)slice on scalar in aggregation context (#25358)unique frame method (#25099)Expr.rolling index_column (#25117).row on a single-row DataFrame, equivalent to .item on a single-element DataFrame (#25229)Expr.over in aggregation context (#25402)map node (#25368)UNNEST support to handle multiple array expressions (#25418)UNNEST behaviour (#22546)as_struct repr (#25529)clear (#25266)IR::Scan to IR::DataFrameScan in expand_datasets when applicable (#25106){Expr,LazyFrame}.rolling (#25058)ewm_var/std in streaming engine (#25109)unique_counts for all datatypes (#25379)JOIN constraints (#25132)quantile in rolling context (#25479)LazyFrame.group_by_dynamic (#25342)group_by_dynamic with large offset (#25376)slice into streaming LazyFrame.rolling (#25338){forward,backward}_fill in group-by contexts (#25115)Expr.reshape((-1,)) as row separable (#25326)aexpr_to_leaf_names_iter (#25319)agg_min/agg_max when nulls present (#25374).rolling_rank support for temporal types and pl.Boolean (#25509)OVER clause behaviour for window functions (#25249)drop_nulls on literal (#25356)Null dtype values in scatter (#25245)group_by for ApplyExpr and BinaryExpr (#25053)sort_by in list.eval context (#25481)group_by_dynamic iterator (#25041)group_by key values are changed (#25032)drop_items for scalar input (#25351)eq_missing for struct with nulls (#25363){first,last}_non_null if there are empty chunks (#25279)SELECT clauses (#25282)DeprecationWarning from SQL "IN" constraints that use subqueries (#25111)select(len) off by 1 with comment prefix (#25069)arr.{eval,agg} in aggregation context (#25390)format_str in case of multiple chunks (#25162)groups update on slices with different offsets (#25097)group_by (#25179)write_ipc (#25497)sort_by with AggregatedScalar (#25503)Null dtype in ApplyExpr on group_by (#25077).list.eval after slicing operations (#25540)eval expressions in streaming engine (#25294).join_asof(strategy="nearest", allow_exact_matches=False, ...) (#25506)ColumnPredicates generation for inequalities operating on integer columns (#25412)dt.truncate for invalid duration strings (#25124)PyExpr to PyObject conversion (#25265)AmortSeries (#25043)pl.col.<colname> edge-cases (#25153)first/last with ignore_nulls (#25414){n_,}unique on bools (#25275)drop_nans filtering in group-by context (#25146)str.json_decode output deterministic with lists (#25240){forward,backward}_fill as length_preserving (#25352)is_pycapsule utility function (#25073)first_non_null/last_non_null (#25375)first/last (#25298)Expr.rolling in .over (#25283)group_by_dynamic with group_by and multiple chunks (#25075)is_in for mixed validity pages (#25313)Expr casts in pl.lit invocations (#25373)Expr reprs (#25101)struct (#25281)pl.format behavior with nulls (#25370)mean/median for temporals (#25512)asyncio if not inside a running loop (#25268)list.agg, unique and scalar (#25348)group_by iterator (#25138)AggregatedList in list.{eval,agg} context (#25385)SQL interface should use logical, not bitwise, behaviour for unary "NOT" operator (#25091)LazyFrame.pivot to reference guide (#25482)having API references (#25428)str.slice taking Expression params (#25461)and_, or_, and not_ Expressions on integer columns (#25092)datetime_range instead of date_range in resampling page (#25532)Categorical functions for lexical ordering and local checks (#25514)any_horizontal/all_horizontal docstring (#25469)markdown-link-check (#25314)replace_all reference in replace docs (#25161)LazyFrame.collect_schema docstring (#25508)LazyFrame.remote signature (#25175)assert_sql_matches coverage for SQL "DISTINCT" and "DISTINCT ON" syntax (#25440)pl.format on multiple chunks (#25164)group_by aggregations (#25290)group_by(...).having(...) (#25430)make fmt and make lint commands (#25200)Final type-qualifier to module-level constants (#25556)proptest AnyValue strategies (#25510)proptest DataFrame strategy (#25446)proptest strategies for Series logical types (#24849)proptest strategies for Series nested types (#25220)Column::Partitioned (#25324)maturin with --uv option (#25490)ruff and typos and made the necessary lint updates (#25196)pipe_with_schema (#25388)scan_lines (#25066)ElementExpr for _eval expressions (#25199)list.eval on multiple chunks with slicing (#25559)scan_lines (#25136)EwmCov kernel (#25065)ShapeError (#25004)CloudScheme in parse_cloud_options (#25304)Series.set to zip_with_same_dtype (#25327)pipe_with_schema work on Arced schema (#25155)EwmMeanState to polars-compute (#25034)tolerance type coercion to IR conversion (#25033)date_range and related functions (#24084)dt_range functions (#25225)ClosableFile (#25330)PyPartitioning (#25303)Context (#25424)optimization_toggle (#25130)URL_ENCODE_CHARSET to HIVE_ENCODE_CHARSET (#25554)&dyn Any instead of Box<dyn Any> in python object converters (#25421)sync parameter in Writeable::close (#25475)Thank you to all our contributors for making this release possible! @AndreaBozzo, @DannyStoll1, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @MarcoGorelli, @TNieuwdorp, @alexander-beedie, @borchero, @c-peters, @cBournhonesque, @carnarez, @cmdlineluser, @coastalwhite, @cr7pt0gr4ph7, @davanstrien, @dsprenkels, @etiennebacher, @feliblo, @itamarst, @jannickj, @jetuk, @kdn36, @lun3x, @marinegor, @mcrumiller, @nameexhaustion, @orlp, @ritchie46, @vyasr, @wtn and more!
Nothing published for this version
Fix incorrect drop_nans() result when used in group_by() / over()
drop_nans() result when used in group_by() / over() (https://github.com/pola-rs/polars/pull/25146)Null dtype in ApplyExpr on group_by(https://github.com/pola-rs/polars/pull/25077)group_by (https://github.com/pola-rs/polars/pull/25179)Thank you to all our contributors for making this release possible! @coastalwhite, @kdn36, @nameexhaustion and @ritchie46
Don't recompute full rolling moment window when NaNs/nulls leave the window
glimpse to return a DataFrame (#24803)allow_empty flag to item (#25048)SQL interface should use logical, not bitwise, behaviour for unary "NOT" operator (#25091)group_by_dynamic with group_by and multiple chunks (#25075)is_pycapsule utility function (#25073)group_by for ApplyExpr and BinaryExpr (#25053)group_by key values are changed (#25032)AmortSeries (#25043)group_by_dynamic iterator (#25041)ShapeError (#25004)Thank you to all our contributors for making this release possible! @Kevin-Patyk, @Liyixin95, @alexander-beedie, @coastalwhite, @kdn36, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Deprecate Expr.agg_groups() and pl.groups()
unique to native group-by and speed up n_unique in group-by context (#24976)take{_slice,}_unchecked (#24980)skew and kurtosis in group-by context (#24961)bitwise_* operations (#24935)group_by_dynamic slowness in sparse data (#24916)filter/drop_nulls/drop_nans in group-by context (#24897)cumulative_eval using the group-by engine (#24889)Dataframes in DslPlan serialization (#24852)null_count, any and all group-by aggregations (#24859)reverse in group-by context (#24855)first/last on Decimals, Categoricals and Enums (#24786)BitMapIter::nth (#24766)ewm_mean() in streaming engine (#25003)Expr.item to strictly extract a single value from an expression (#24888)scan_iceberg().select(len()) (#24602)glob parameter to scan_ipc (#24898)Dataframes in DslPlan serialization (#24852)list.agg and arr.agg (#24790){Expr,Series}.rolling_rank() (#24776)read_database_uri if ADBC engine version supports PyCapsule interface (#24029)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)arr.eval (#24472)read_database with the ADBC engine and support iter_batches with the ADBC engine (#24180)separator to {Data,Lazy}Frame.unnest (#24716)union() function for unordered concatenation (#24298)name.replace to the set of column rename options (#17942)np.ndarray -> AnyValue conversion (#24748)DataFrame load from list of dicts (#24739)read_excel workaround for fastexcel/calamine issue loading a column subset from a named table (#25012)any(ignore_nulls) and OOB in all (#25005)join_asof on a casted expression (#25006)ApplyExpr (#24709)Pyarrow scan to in-memory engine (#24991)Operator::swap_operands return correct operators for Plus, Minus, Multiply and Divide (#24997)pct_change (#24952)over with sliced groups (#24887)any / all for group-by (#24940)scan_parquet partially unknown (#24928)read_parquet_metadata (#24922)partition_by columns in over expression (#24874)df.filter expressions (#24870)with_row_index() after scan() silently ignored (#24866)BinaryExpr in group_by dispatch logic (#24548)gather (#24857)group_by (#24819)range feature depend on dtype-array feature (#24853)EvalExpr (#24650)AggState::LiteralScalar (#24820)group_aware for fallible expressions with masked out elements (#24815)arr.sum() on small integer Array dtypes containing nulls (#24478)write_database() to Snowflake due to unsupported string view type (#24622)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)overlapping instead of rolling (#24787)dynamic_group_by and rolling object (#24740)bitmask::nth_set_bit_u64 (#24775)Expr.sign for Decimal datatype (#24717)str.replace with missing pattern (#24768)schema_overrides is respected when loading iterable row data (#24721)decimal_comma on Decimal type in write_csv (#24718){arr,list}.agg API references (#24970)name.replace examples (#24941)sink_* methods (#24918){unique,value}_counts examples (#24927)pl.field into the api docs (#24846)build_feature_flags.py is included in artifact (#25024)LazyFrame.set_sorted into a FunctionIR::Hint (#24981)Expr.agg_groups() and pl.groups() (#24919)set_ operations (#24850)GroupByPartitioned and dispatch to streaming engine (#24903)element() into {A,}Expr::Element (#24885)ScanOptions to new_from_ipc (#24893)Context in Window expression (#24875)FunctionExpr dispatch from plan to expr (#24839)ApplyExpr (#24825)days_in_month to documentation (#24822)pl.format into proper elementwise expression (#24811)ApplyExpr in group_by context on multiple inputs (#24520)rolling groups to overlapping (#24577)DataType proptest strategies (#24763)union to documentation (#24769)Thank you to all our contributors for making this release possible! @EndPositive, @EnricoMi, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Object905, @alexander-beedie, @borchero, @carnarez, @cmdlineluser, @coastalwhite, @craigalodon, @dsprenkels, @eitsupi, @etrotta, @henryharbeck, @jordanosborn, @kdn36, @math-hiyoko, @mjanssen, @nameexhaustion, @orlp, @pavelzw, @r-brink, @ritchie46, @thomasjpfan and @williambdean
Address group_by_dynamic slowness in sparse data
group_by_dynamic slowness in sparse data (#24916)filter/drop_nulls/drop_nans in group-by context (#24897)cumulative_eval using the group-by engine (#24889)Dataframes in DslPlan serialization (#24852)null_count, any and all group-by aggregations (#24859)reverse in group-by context (#24855)first/last on Decimals, Categoricals and Enums (#24786)BitMapIter::nth (#24766)scan_iceberg().select(len()) (#24602)glob parameter to scan_ipc (#24898)Dataframes in DslPlan serialization (#24852)list.agg and arr.agg (#24790){Expr,Series}.rolling_rank() (#24776)read_database_uri if ADBC engine version supports PyCapsule interface (#24029)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)arr.eval (#24472)read_database with the ADBC engine and support iter_batches with the ADBC engine (#24180)separator to {Data,Lazy}Frame.unnest (#24716)union() function for unordered concatenation (#24298)name.replace to the set of column rename options (#17942)np.ndarray -> AnyValue conversion (#24748)DataFrame load from list of dicts (#24739)read_parquet_metadata (#24922)partition_by columns in over expression (#24874)df.filter expressions (#24870)with_row_index() after scan() silently ignored (#24866)BinaryExpr in group_by dispatch logic (#24548)gather (#24857)group_by (#24819)range feature depend on dtype-array feature (#24853)EvalExpr (#24650)AggState::LiteralScalar (#24820)group_aware for fallible expressions with masked out elements (#24815)arr.sum() on small integer Array dtypes containing nulls (#24478)write_database() to Snowflake due to unsupported string view type (#24622)Series init consistent with DataFrame init for string values declared with temporal dtype (#24785)overlapping instead of rolling (#24787)dynamic_group_by and rolling object (#24740)bitmask::nth_set_bit_u64 (#24775)Expr.sign for Decimal datatype (#24717)str.replace with missing pattern (#24768)schema_overrides is respected when loading iterable row data (#24721)decimal_comma on Decimal type in write_csv (#24718)sink_* methods (#24918){unique,value}_counts examples (#24927)pl.field into the api docs (#24846)set_ operations (#24850)GroupByPartitioned and dispatch to streaming engine (#24903)element() into {A,}Expr::Element (#24885)ScanOptions to new_from_ipc (#24893)Context in Window expression (#24875)FunctionExpr dispatch from plan to expr (#24839)ApplyExpr (#24825)days_in_month to documentation (#24822)pl.format into proper elementwise expression (#24811)ApplyExpr in group_by context on multiple inputs (#24520)rolling groups to overlapping (#24577)DataType proptest strategies (#24763)union to documentation (#24769)Thank you to all our contributors for making this release possible! @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Object905, @alexander-beedie, @borchero, @cmdlineluser, @coastalwhite, @craigalodon, @dsprenkels, @eitsupi, @etrotta, @henryharbeck, @jordanosborn, @kdn36, @math-hiyoko, @nameexhaustion, @orlp, @pavelzw, @ritchie46, @thomasjpfan and @williambdean
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)gather_every (#24700)strptime if input is literal (#24694)groups call in aggregated (#24651)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)dt.total_{}() duration values as fractionals (#24598)pyarrow dependency in read_excel when using the default "calamine" engine (#24655)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)Decimal with comma as decimal separator in CSV (#24685)Categories pickleable (#24691)AggregatedScalar in ApplyExpr single input (#24634)setuptools (#24656)GenericFirstLastGroupedReduction (#24590)dt.month_end was unnecessarily raising when the month-start timestamp was ambiguous (#24647)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)test_multiple_sorting_columns test runnable (#24719){Upper,Lower}Bound expressions in IR (#24701)uv pip option syntax (#24711)polars-expr output field resolution (#24661)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @DeflateAwning, @Gusabary, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Matt711, @alexander-beedie, @alonsosilvaallende, @andreseje, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @eitsupi, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @moizescbf, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)strptime if input is literal (#24694)groups call in aggregated (#24651)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)dt.total_{}() duration values as fractionals (#24598)pyarrow dependency in read_excel when using the default "calamine" engine (#24655)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)Categories pickleable (#24691)AggregatedScalar in ApplyExpr single input (#24634)setuptools (#24656)GenericFirstLastGroupedReduction (#24590)dt.month_end was unnecessarily raising when the month-start timestamp was ambiguous (#24647)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)polars-expr output field resolution (#24661)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @DeflateAwning, @Gusabary, @JakubValtar, @Kevin-Patyk, @MarcoGorelli, @Matt711, @alexander-beedie, @alonsosilvaallende, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @eitsupi, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @moizescbf, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @Gusabary, @Kevin-Patyk, @Matt711, @MoizesCBF, @alonsosilvaallende, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Add LazyFrame.{sink,collect}_batches
LazyFrame.{sink,collect}_batches (#23980)scan_iceberg with filter based on metadata statistics (#24547).mode() expression (#24459)file:/path URIs (#24603)LazyFrame.{sink,collect}_batches (#23980)hidden_file_prefix parameter to scan_parquet (#24507)pl.Config.set_default_credential_provider (#24434)BinaryOffset type through Parquet (#24344)Struct (#24320)unique / n_unique / arg_unique for array columns (#24406)from_dicts to Iterable[Mapping[str, Any]] (#24584)unsupported arrow type Dictionary error in scan_iceberg() (#24573)polars-stream/diff to polars-plan/abs (#24613)-1) the dimension on any Expr.reshape dimension except the first (#24591)scan_iceberg() storage options not taking effect (#24574)log() prioritize the leftmost dtype for its output dtype (#24581)PlPath::join for cloud paths replace on absolute paths (#24514)AggState on all_literal in BinaryExpr (#24461)explain (#24465)ApplyExpr with single row literal in agg context (#24422)pl.Float32 by int (#24432)iterable_to_pydf(..., infer_schema_length=None) to scan all data (#23405)ignore_errors=False (#24404)approx_n_unique for temporal dtypes and Null (#24417)avg_birthday -> avg_age in examples aggregation (#23726)set_expr_depth_warning docstring (#24427)sed ampersand in release script (#24631)UnknownKind::Ufunc (#24614)to_field for element and struct field context (#24592)pl.concat (#24487)as_struct on aggstates (#24493)PlanCallback in name.map_* (#24484)xlsvwriter to 3.2.5 or before (#24485)Thank you to all our contributors for making this release possible! @Gusabary, @Kevin-Patyk, @Matt711, @MoizesCBF, @alonsosilvaallende, @borchero, @c-peters, @camriddell, @coastalwhite, @dangotbanned, @deanm0000, @dongchao-1, @dsprenkels, @itamarst, @jan-krueger, @joshuamarkovic, @juansolm, @kdn36, @nameexhaustion, @orlp, @r-brink, @ritchie46 and @stijnherfst
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →