NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #419 most downloaded on PyPI
Blazingly fast DataFrame library
Last release 3 days ago
20 Sep 2026
Ships fairly regularly
a new release about every 4 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
67 versions withdrawn
withdrawn after publishing
6 years old
434 releases · first in 2021
One column per quarter.
fix stacklevel of some deprecation warnings
n expression passed to Expr.head/tail (#8098)show_versions util (#8096)scan_parquet/ipc and fsspec (#8071)Thank you to all our contributors for making this release possible! @MarcoGorelli, @StefanBRas, @alexander-beedie, @josh, @n8henrie, @rben01, @ritchie46, @stinodego, @universalmind303 and @zundertj
don't create duplicate pivot names
toggle_string_cache to enable_string_cache (#7970)sort, top_k, sort_by, and arg_sort_by, raise if descending is a sequence and its length doesn't match the number of columns to sort by (#7957)time_unit/time_zone instead of tu/tz (#7910)struct, concat_str, and arg_sort_by (#7308)shift_and_fill and add default… (#7192)func to function (#7139)Series/Expr methods to keyword-only (#7860)FromParalleIter<Option<str>> for Utf8Chunked ~1.9x (#8058)~2.5x (#8057)~2x. (#8053)into_groups materialization ~-25% (#8036)~25% (#7980)DataFrame init from pyarrow RecordBatch objects, and improve init from Array (#8011)write_ipc to take file=None (returning BytesIO) (#7997)Config methods, reference POLARS_MAX_THREADS in threadpool_size docstring (#7965)struct, concat_str, and arg_sort_by (#7308)sort, top_k, sort_by, and arg_sort_by, raise if descending is a sequence and its length doesn't match the number of columns to sort by (#7957)toggle_string_cache to enable_string_cache (#7970)time_unit/time_zone instead of tu/tz (#7910)shift_and_fill and add default… (#7192)func to function (#7139)Series/Expr methods to keyword-only (#7860)Thank you to all our contributors for making this release possible! @MarcoGorelli, @StefanBRas, @alexander-beedie, @ghuls, @rben01, @ritchie46, @stinodego and @universalmind303
improve group\_tuples of high cardinality data ~10%
~10% (#7938)f to function in reduce docstring (#7925)Thank you to all our contributors for making this release possible! @MarcoGorelli, @alexander-beedie, @alonme, @ankane, @dependabot, @dependabot[bot], @lorentzenchr, @rben01, @ritchie46 and @zundertj
auto-infer detecting time-zone-awareness of fmt argument in strptime; deprecate tz\_aware argument
Series.pow() (#7898)lit values (#7879)write_excel (#7871)Unknown dtype to proceed as if dtype is None, to allow inference (#7830)to_repr methods to DataFrame and Series (#7802)DataFrame (#7775)map_dict. (#7797)from_repr function that reconstructs a DataFrame from its table repr (#7781)aggregation_function being 'first' in pivot. In a future version, it will default to None (#7784)check_exact for temporal types in assert_series_equal (#7896)_repr_html_ escapes column names in addition to data/body elements (#7877)is_between (#7835)venv folder to .venv (#7790)make requirements option to install/refresh dependencies without having to recreate the venv (#7792)ruff target version (#7791)Thank you to all our contributors for making this release possible! @LdRoW, @MarcoGorelli, @Newtoniano, @advoet, @alexander-beedie, @duskmoon314, @foxcroftjn, @ghuls, @jonashaag, @ritchie46, @stinodego and @zundertj
raise error on invalid categorical cast
Datetime or Duration dtype timeunit (#7768)Thank you to all our contributors for making this release possible! @alexander-beedie, @ghuls, @ritchie46 and @universalmind303
runtime SIMD target detection for min/max/sum and impl SIMD mean ~2-5x
min/max/sum and impl SIMD mean ~2-5x (#7702)write_excel that adds a row-wise total column using structured references (#7751)min/max (#7742)concat_list (#7745)Series.hist (#7727)qcut (#7724)maintain_order option to Series.cut (#7723)maintain_order in arr.unique (#7721)DataFrame.top_k/ LazyFrame.top_k (#7720)set_fmt_float value in Config load/save state (#7696)add operator-equivalent expression (#7667)is_leap_year to temporal expressions (#7618)scan_csv to take a list of column names in a new_columns param (#7642)groupby/unique of groupby on integer keys (#7604)is_in expressions (#7613)Series init regression from list of np.arange objects (#7692)__version__ attribute (#7680)Series init with integer 1/0 values (#7619)Expr.pipe API docs link (#7734)wrap_x utils to utils module (#7672)expr parsing to utils (#7661)internals (#7650)internals (#7649)Thank you to all our contributors for making this release possible! @MarcoGorelli, @alexander-beedie, @borchero, @chitralverma, @didriksg, @ghuls, @jakob-keller, @minimav, @ritchie46, @stinodego, @universalmind303 and @zundertj
optimize string kernels, (elide redundant allocs)
str_replace for same length replacements ~2x (#7580)DataFrame init by implementing dynamic singledispatch registration (#7559)str.replace_n and add n argument ~10x (#7575)replace_literal_all of single byte replacements ~15x. (#7565)DataFrame init by implementing dynamic singledispatch registration (#7559)head/tail (#7554)BatchedCsvReader from public API (#7546)internals (#7597)lru_cache to the apply docstrings (#7593)pli in type hints (part 2) (#7587)pli in type hints (part 1) (#7586)fmt tests to test_fmt (#7555)sep arg to separator (#7533)Thank you to all our contributors for making this release possible! @MarcoGorelli, @Vincenthays, @alexander-beedie, @ritchie46, @stinodego, @universalmind303 and @vincev
use atoi in favor of lexical in strptime -25%
-25% (#7501)~20% (#7500)-40% (#7498)-~0.15% (#7494)Decimal dtype (#7511)show_versions with xlsxwriter (and add as optional dependency) (#7507)LazyFrame init in docs (#7508)Thank you to all our contributors for making this release possible! @CloseChoice, @MarcoGorelli, @alexander-beedie, @ecashin, @ritchie46 and @stinodego
speed up comparison of sorted arrays ~3.85x.
~3.85x. (#7478)LazyFrame.unique (#7470)LazyFrame.unique (#7466)row_heights on Excel export (#7447)Excel export when all data in a multi-column conditional format is contiguous (#7427)Excel table column/range (#7411)low_memory=True. (#7394)Excel export (allows for heatmaps) (#7379)Excel export (#7380)DataFrame rendering compatible with quarto and pandoc (#7455)DataFrame table rendering issue in some Jupyter environments (#7450)Excel export improvements/fixes (#7363)read_x functions arg file to source (#7460)utils module (#7435)prec to precision (#7401)_base_type util (#7410)from_x to data (#7407)schema keyword description from `pl.… (#7400)cfg module to config (#7385)datatypes module (#7357)Thank you to all our contributors for making this release possible! @Hofer-Julian, @MarcoGorelli, @SauravMaheshkar, @aldanor, @alexander-beedie, @cjackal, @ghuls, @josh, @juba, @nrebena, @rben01, @ritchie46, @stinodego and @universalmind303
optimize str.replace ~2x improvement
~2x improvement (#7347)LazyFrame.explode streamable. (#7341)NullArray values to python row tuple (#7346)write_excel API docs link (#7338)Thank you to all our contributors for making this release possible! @alexander-beedie, @ritchie46 and @s-banach
deprecate describe_(optimized)_plan in favor of explain
write_excel IO method (#7251)Excel tables (#7333)write_database (#7322)DataFrame.write_database) (#7318)expr.apply streamable in selection context (#7316)unnest args (#7310)write_excel IO method (#7251)describe_(optimized)_plan in favor of explain (#7264)is_in exprs (#7169)**named_exprs input for struct (#7208)pl.struct mappable (#7299)str.parse_int (#7072)every type is properly normalised (for groupby_dynamic and groupby_rolling) (#7238)cols=int definition respects allowed_dtypes (#7213)read/write_database tests (#7327)scan_ds to scan_pyarrow_dataset (#7320)read_sql to read_database (#7315)git2 vulnerability (#7309)DataFrame.pearson_corr (#7307)write_excel doctests (#7306)pytest-xdist with worksteal (#7304)io module per type (#7295)_html module to dataframe module (#7256)strict for ruff TCH lints (#7234)DataFrame and LazyFrame init params don't diverge (#7214)Thank you to all our contributors for making this release possible! @MarcoGorelli, @aldanor, @alexander-beedie, @coinflip112, @csko, @dependabot, @dependabot[bot], @ghuls, @josemasar, @josh, @mslapek, @nrebena, @ozgrakkurt, @papparapa, @ptiza, @rben01, @ritchie46, @sorhawell, @stinodego, @universalmind303, @xyning and @zundertj
Add Series.cut, deprecate pl.cut
sequence_to_pydf (#7044)LazyFrame init (same params as DataFrame) (#7122)base_type method to DataType (#7166)explode args (#7115)_unpack_schema to prevent potential TypeError (#7128)Thank you to all our contributors for making this release possible! @MarcoGorelli, @Trippy3, @alexander-beedie, @foxcroftjn, @ghuls, @iamsmkr, @jakob-keller, @josh, @mslapek, @papparapa, @ritchie46, @romanovacca, @stinodego, @universalmind303 and @zundertj
Deprecate more non-keyword arguments
clear (#7095)drop args (#7063)partition_by args (#7065)exclude args (#7082)from_records (#7033)aggregate_fn to aggregate_function (#7059)TYPE_CHECKING lints (#7070)f/func to function (#7032)type: ignore (#7028)arr.count_match() (#7029)Thank you to all our contributors for making this release possible! @MarcoGorelli, @alexander-beedie, @coinflip112, @datapythonista, @jakob-keller, @moritzwilksch, @ritchie46, @stinodego, @universalmind303 and @zundertj
Properly deprecate .struct.to_frame
arr.count_match expression and optimize arr.sum for List<Boolean> (#7023)selection_to_pyexpr_list (#7020)LazyFrame.with_columns() (#7019)expr_to_lit_or_expr for arguments of type Expr by ~80% (#6967)~5-15% (#6959)~8-18% group tuples. (#6956)arr.count_match expression and optimize arr.sum for List<Boolean> (#7023)coalesce args (#6989)agg args (#6982)packaging and/or distutils dependency with a minimal version parser utility (#6972)over args (#6986)upper_bound and lower_bound methods to Series (#6990)col args (#6996)sort args (#6896)map_dict method for Series (#6946)pl.lit value (#6991)median -> mean (#6960).struct.to_frame (#6958)Thank you to all our contributors for making this release possible! @MarcoGorelli, @MatveyF, @alexander-beedie, @jakob-keller, @mslapek, @ozgrakkurt, @papparapa, @ritchie46, @sorhawell, @stinodego, @xhochy and @zundertj
add is\_duplicated/is\_unique for struct dtype
is_between method for Series (#6933)Utf8 to polars dtype (#6885)groupby args (#6872)date => object typing in to_pandas method (#6902)PYTHONPATH from bleeding into polars venv (#6888)unit.io tests directory with python io module (#6889)unit.io tests directory with python io module (#6889)datelike as temporal, and support Time dtype in Series.to_numpy (#6881)Self type more consistently (#6882)Thank you to all our contributors for making this release possible! @MarcoGorelli, @adamgreg, @alexander-beedie, @josh, @jvdd, @ritchie46 and @stinodego
Deprecate non-keyword args for some functions
~2x (#6861)include_index option on init from pandas frames (#6847)col type signature to improve hint interaction with PyCharm (#6850)join args (#6826)groupby docstring/rendering (#6816)Thank you to all our contributors for making this release possible! @MarcoGorelli, @alexander-beedie, @ghuls, @josh, @kngwyu, @oysols, @ritchie46, @stinodego and @zundertj
boolean Series broadcast comparison (eq/neq) against scalar True/False
arg_min/arg_max (#6799)Series broadcast comparison (eq/neq) against scalar True/False (#6797)Thank you to all our contributors for making this release possible! @alexander-beedie, @igmriegel and @ritchie46
let cast\_time\_zone work on tz-naive and deprecate tz-localize
map_dict (#6781)pl.concat from generator expression (#6779)map_dict expression. (#5899)with_columns args (#6686)NotFound exceptions (#6670)select args (#6667)rename implementation. (#6688)Series methods that can return None (#6690)iter_rows always returns all values from all chunks/batches in accelerated codepath (#6708)is_between (#6661)Field repr (#6640)mypy to version 1.0.0 (#6744)ignore_nulls into EWM parametric tests (#6751)nan_to_null and nan_to_none parameter names, expose to DataFrame init, add test coverage (#6637)extend_constant docs/typing (and test coverage) (#6646)Thank you to all our contributors for making this release possible! @AnatolyBuga, @MarcoGorelli, @MatveyF, @alexander-beedie, @ghuls, @jgmartin, @phaile2, @plaflamme, @ritchie46, @sorhawell, @stinodego, @yuntai and @zundertj
improve dynamic groupby performance on sorted keys
pyarrow (#6581)select context, improve related typing (#6628)pyarrow (#6592)is_between with string bounds, and extend test coverage for the same (#6627)diff methods (#6630)structify behaviour experimental, while also extending it to aliased expressions (#6615)ruff version and some settings (#6588)assert_series_equal instead of s.series_equal(...) (#6582)assert_frame_equal instead of assert df.frame_equal(...) (#6553)Thank you to all our contributors for making this release possible! @2-5, @MarcoGorelli, @abalkin, @alexander-beedie, @cojmeister, @dependabot, @dependabot[bot], @jjerphan, @plaflamme, @ritchie46 and @stinodego
Remove deprecated paths from Series.__getitem__
with_columns kwarg expressions with multiple output names to struct; extend **named_kwargs support to select (#6497)Series.__getitem__ (#6048)read/write_json arguments (#5990)schema, schema_overrides, and orient consistent on all user-facing interfaces (#6387)Groupby.pivot (#6016)Series.shuffle default behaviour (#5991)Expr.is_between default behaviour (#5985)with_columns kwarg expressions with multiple output names to struct; extend **named_kwargs support to select (#6497)series dispatch methods (#6523)iter_rows(named=True) and to_dicts(), if pyarrow available (#6493)Series.__getitem__ (#6048)read/write_json arguments (#5990)Groupby.pivot (#6016)Series.shuffle default behaviour (#5991)Expr.is_between default behaviour (#5985)chunk_size cannot be smaller than infer_schema_length (#6541)verify_series_and_expr_api util (#6524)schema, schema_overrides, and orient consistent on all user-facing interfaces (#6387)Thank you to all our contributors for making this release possible! @MarcoGorelli, @alexander-beedie, @gab23r, @papparapa, @ritchie46, @romanovacca, @stinodego and @zundertj
deprecate iterrows in favour of iter_rows, add new @redirect class decorator
iterrows in favour of iter_rows, add new @redirect class decorator (#6461)Thank you to all our contributors for making this release possible! @alexander-beedie, @josh, @ritchie46 and @stinodego
deprecate columns param for DataFrame init; transitioning to schema
with_column (#6128)DataFrame slices (#6414)to_dicts method (#6415)str.ends_with (#6361)str.starts_with (#6355)explode to namespaces (#6351)Series.struct.to_frame to .struct.unnest (#6352)dtype groups, and improve some related typing (#6442)from_dicts and DataFrame init from list of dicts behave consistently, update/improve related docstrings (#6431)schema_overrides with frame-init from list of dicts (#6424)is_between typing with time in start and end (#6393)Config as a context manager (#6439)from_dicts and DataFrame init from list of dicts behave consistently, update/improve related docstrings (#6431)columns param for DataFrame init; transitioning to schema (#6366)Expr.flatten (#6370)Thank you to all our contributors for making this release possible! @ChayimFriedman2, @MarcoGorelli, @alexander-beedie, @c-peters, @flowlight0, @gab23r, @gam-phon, @ghuls, @jgmartin, @josh, @ritchie46, @romanovacca, @stinodego, @universalmind303 and @zundertj
reuse allocated scratches in ipc writer
dt.combine for combining date and time components (#6121)schema_overrides param for more ergonomic DataFrame init (#6230)None input for head/tail (#6326)__floordiv__ op (#6280)int (#6266)_from_pandas constructor (#6310)pyproject.toml (#6271)io tests to the same folder (#6277)Thank you to all our contributors for making this release possible! @MarcoGorelli, @alexander-beedie, @c-peters, @dependabot, @dependabot[bot], @ghuls, @n8henrie, @ritchie46, @stinodego and @universalmind303
ensure ooc sort works ooc with all-constant values
head and tail methods (#6173)DataFrame.unique(keep="none") (#6169)Struct dtypes on DataFrame/Series init (#6145)infer_schema_length to frame init (#6210)with_columns in with_columns_kwargs mode compatible with more data types (#6126)with_columns to reflect a new dataframe is being returned (#6122)DataFrame from schema (#6225)closed argument (#6198)Thank you to all our contributors for making this release possible! @MarceColl, @MarcoGorelli, @alexander-beedie, @gab23r, @ghuls, @jvanbuel, @n8henrie, @rben01, @ritchie46, @ropoctl, @sorhawell, @stinodego, @winding-lines and @zundertj
Assert deprecation warning on check\_column\_names
arr.take expression (#6116)extend_constant to work with date literals (#6114)rounded_corners modifier to pl.Config.set_tbl_formatting (#6108)read_csv error message (#6082)unused import autofix via ruff (#6102)Thank you to all our contributors for making this release possible! @alexander-beedie, @gitkwr, @huitseeker, @ritchie46, @stinodego and @zundertj
Properly deprecate groupby.pivot
GroupBy (#6051)DataFrame.select (#6047)from_epoch function signature (#6024)estimated_size parameter (#6018)read_sql and row docstrings (#6028)isort-style import autofix via ruff (#6020)groupby.pivot (#6000)Thank you to all our contributors for making this release possible! @alexander-beedie, @ghuls, @ritchie46, @stinodego and @universalmind303
large speedup for df.iterrows (~200-400%)
Expr.is_between API (#5981)df.iterrows (~200-400%) (#5979)assert_frame_equal messages (#5962)Thank you to all our contributors for making this release possible! @alexander-beedie, @ritchie46 and @stinodego
Nothing published for this version
improve reducing window function performance ~33%
str.strip with multiple chars (#5929)*_options arguments (#5852)Thank you to all our contributors for making this release possible! @AnatolyBuga, @alexander-beedie, @cannero, @chitralverma, @dannyvankooten, @johngunerli, @ozgrakkurt, @ritchie46, @stinodego, @winding-lines and @zundertj
Nothing published for this version
impove performance reducing window functions with numeric output ~-14%
~-14% (#5841)Thank you to all our contributors for making this release possible! @chitralverma, @ghuls and @ritchie46
fix parquet regression upstream in arrow2
cmake-rs patch (#5794)Thank you to all our contributors for making this release possible! @OneRaynyDay, @messense, @ritchie46 and @universalmind303
Nothing published for this version
Nothing published for this version
set\_sorted flag when creating from literal
Some(0) (#5773)Thank you to all our contributors for making this release possible! @AnatolyBuga, @MarcoGorelli, @alexander-beedie, @andrewpollack, @braaannigan, @chitralverma, @ghuls, @ritchie46, @sa- and @zundertj
ensure fast\_explode propagates
DataFrame.n_chunks return type (#5650)test_parquet_datetime (#5696)Thank you to all our contributors for making this release possible! @alexander-beedie, @ankane, @braaannigan, @ghais, @ghuls, @jjerphan, @pickfire, @ritchie46, @stinodego and @zundertj
Update Expr.sample signature and change random seeding
Expr.sample signature and change random seeding (#4648)null_equal default to True for Series.series_equal (#5051)Expr.sample signature and change random seeding (#4648)null_equal default to True for Series.series_equal (#5051)Thank you to all our contributors for making this release possible! @Kuhlwein, @braaannigan, @ghuls, @matteosantama, @ritchie46 and @stinodego
Nothing published for this version
improve streaming primitve groupby
Thank you to all our contributors for making this release possible! @alexander-beedie, @ghuls, @ritchie46 and @stinodego
Nothing published for this version
specialized utf8 groupby in streaming
timedelta with duration-type arguments (#5487)Series name when exporting to pandas (#5498)Thank you to all our contributors for making this release possible! @alexander-beedie, @braaannigan, @ghuls, @ritchie46, @sorhawell and @zundertj
Nothing published for this version
additional autocomplete affordances for IPython users
IPython users (#5477)fill_null with temporal literals (#5440)DataFrame and LazyFrame API docs, misc design improvements (#5433)Thank you to all our contributors for making this release possible! @alexander-beedie, @dannyvankooten, @ritchie46, @s1ck, @slonik-az, @stinodego and @universalmind303
build\_info() provides detailed information how polars was built
width property to LazyFrame (#5431)Series.dot method and related interop (#5428)DataFrame init from generators (#5424)Series init from generator (#5411)Thank you to all our contributors for making this release possible! @CalOmnie, @alexander-beedie, @ghuls, @ritchie46, @slonik-az, @stinodego and @universalmind303
improve rendering of API docs type signatures, mark PivotOps as deprecated, misc tidy-ups
Series from python range object (#5397)DataFrame operators (#5394)Thank you to all our contributors for making this release possible! @YuRiTan, @alexander-beedie, @braaannigan, @owrior, @ritchie46 and @zundertj
don't raise error but print a warning if mp fork method…
Thank you to all our contributors for making this release possible! @AlecZorab, @alexander-beedie, @ghuls and @ritchie46
Catch deprecation warnings in unit tests
Thank you to all our contributors for making this release possible! @alexander-beedie, @ghuls, @ritchie46, @thatlittleboy, @universalmind303 and @zundertj
include slice in sort fast path
Thank you to all our contributors for making this release possible! @ritchie46
make date\_range timezone aware
polars_type_to_constructor works with tz-aware Datetime dtypes (#5239)tuple[bool, bool] instead of Sequence[bool] for Expr.is_between (#5094)Thank you to all our contributors for making this release possible! @YuRiTan, @alexander-beedie, @cjermain, @matteosantama, @ritchie46 and @stinodego
improve pivot performance by using faster series…
DataFrame init with Datetime dtypes that specify a timezone (#5174)n_unique() that can count unique rows or col/expr subsets (#5165)extract conversion for Time datatype (#5161)time object (#5152)list types are better defined as Sequence (#5164)Thank you to all our contributors for making this release possible! @alexander-beedie, @dannyvankooten, @ghuls, @ritchie46 and @sorhawell
deprecate name argument in drop
Thank you to all our contributors for making this release possible! @alexander-beedie, @owrior, @ritchie46 and @slonik-az
more conservative JIT sort settings
Thank you to all our contributors for making this release possible! @mcrumiller, @ritchie46 and @zundertj
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
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 →