NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #251 most downloaded on PyPI
Extremely lightweight compatibility layer between dataframe libraries
Last release 21 days ago
08 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
4 versions withdrawn
withdrawn after publishing
3 years old
243 releases · first in 2024
fix: fixup polars join version check throwing unnecessary deprecation warning for outer join
Expr.clip method (#2303)rank for Lazy backends (#2310).over(order_by=...) for non-order-dependent operations (as it signals a user error) (#2314)rolling_var and rolling_std for lazy backends (#2299)scan_csv function (#2300)DuckDBExpr.is_unique() method (#2301)rolling mean for lazy backends (#2297)scan_parquet function (#2295)DataFrame.clone for pyarrow (#2288)cum_count and cum_prod to PySpark and DuckDB (#2286)cum max and cum_min for DuckDB (#2278)sqlframe pin from --group typing (#2298)duckdb quack more like polars (#2321)CompliantDataFrame.from_arrow (#2306)_polars.utils dtype ignores (#2312)PolarsExpr (#2313)LazyExprNameNamespace (#2311)CompliantDataFrame.from_dict (#2304)._with_* for internal API methods (#2305)EagerSeries*Namespace protocols (#2294).from_iterable() in new_series (#2302)*(Namespace|DataFrame).from_numpy (#2283)._native_series refs (#2293)expected data has every column of theresult data (#2296)._native_frame refs (#2290)CompliantExpr._metadata (#2282)Thank you to all our contributors for making this release possible! @EdAbati, @FBruzzesi, @MarcoGorelli, @dangotbanned and @raisadz
One column per month.
feat!: remove maintain_order from LazyFrame.unique, as it was never supported
maintain_order from LazyFrame.unique, as it was never supported (#2247)cum_min to PySpark (#2267)order_by in Expr.over public (#2271)diff, shift, is_first_distinct, is_last_distinct for PySpark, SQLFrame, and DuckDB (#2270)cum_max for PySpark (#2265)scan_parquet (#2235)Binary dtype support (#2243)maintain_order from LazyFrame.unique, as it was never supported (#2247)_FullContext to CompliantDataFrame (#2251)order_by in Expr.over public (#2271)_arrow (#2275)DepthTracking* typing (#2272)ExpansionKind in ExprMetadata (#2266)Compliant(When|Then) (#2261)CompliantExpr._with_metadata (#2262)CompliantGroupBy (#2252)CompliantSeries (#2236)validoopsie and pointblank) and re-order dependency groups (#2255)CompliantDataFrame.native (#2249)CompliantLazyFrame (#2232)conftest.py (#2241)dependency-groups (#2238)noxfile.py syntax for nox-2025.2.9 (#2240)Thank you to all our contributors for making this release possible! @EdAbati, @FBruzzesi, @MarcoGorelli, @dangotbanned, @marvinl803, @mgorny, @raisadz and @tylerriccio33
chore: Deprecate native_namespace in favour of backend in from_arrow
native_namespace refs (#2221)native_namespace in favour of backend in from_arrow (#2219)native_namespace in favour of backend in scan_csv (#2218)native_namespace in favour of backend in scan_parquet (#2217)native_namespace in favour of backend in read_parquet (#2216)native_namespace in favour of backend in from_numpy (#2215)native_namespace in favour of backend in new_series (#2212)with_columns (#2224)Time datatype (#2113)fill_null for spark-like (#2220)cast_test.py::test_cast_time for cudf (#2231)@overload in nw.from_native(...) (#2211)large_string to string unnecessarily in concat_str for PyArrow (#2176)_compliant sub-package (#2149)native_namespace refs (#2221)dtypes_tests.py (#2144)sqlframe>=3.24.0 errors (#2187)CompliantDataFrame (#2223)CompliantSeries.from_numpy (#2196)CompliantNamespace protocol (#2202)format to builtins-ignorelist (#2199)_spark_like internally (#2190)_compliant sub-package (#2149)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @FBruzzesi, @MarcoGorelli, @dangotbanned, @lucas-nelson-uiuc, @luke396 and @marvinl803
fix!: align Series.filter param name with Polars
Series.filter param name with Polars (#2164)struct namespace with field method. (#2146)rolling_sum for sqlframe and pyspark (#2168)cum_sum for lazy backends (#2132)Series.filter param name with Polars (#2164)NativeSeries Protocol (#2159)pandas-stubs ignores (#2172)_Stores(Native|Compliant) (#2130)SparkLikeExpr properties (#2152)Thank you to all our contributors for making this release possible! @FBruzzesi, @MarcoGorelli, @dangotbanned, @osoucy, @skritsotalakis and @DeaMariaLeon
[pre-commit.ci] pre-commit autoupdate
CompliantExpr (#2119)over for pandas-like (#2141)over context for pandas-like, support over for multi-partitioned dask (#2138)win32 (#2147)nw.when regarding chained statements (#2151)win32 (#2147)win32 (#2147)chain.from_iterable more (#2140)CompliantExpr.from_column_names to reuse for CompliantNamespace.<all|col|exclude> (#2134)Thank you to all our contributors for making this release possible! @FBruzzesi, @MarcoGorelli, @dangotbanned, @pre-commit-ci[bot] and pre-commit-ci[bot]
chore: deprecate LazyFrame.gather_every in main namespace (but maintain it in stable.v1)
CompliantSelector (#2064)LazyFrame.gather_every in main namespace (but maintain it in stable.v1) (#2103)DataFrame.sort_values overload match (#2109)lambda in *Namespace.all (#2102)nw.exclude (#2122).diff().over(group) (#2128)DataFrame.iter_columns (#2104)Series to v1 (#2110)over signature with Polars (#2096)Expr in fill_null signature (#2129).filter constraints (#2114)pyspark unpivot with index None (#2090)Implementation page (#2107)ArrowGroupBy.__iter__ (#2133)CompliantDataFrame (#2115)pyspark (#2051)TypeVar (#2108)group_by (#2105)lambda in *Namespace.all (#2102)has_open_windows to ExprMetadata instead of is_order_dependent (#2078)_dask errors (#2087)IntoCompliantExpr (#2088)(Pandas|Arrow)(When|Then) (#2089)Thank you to all our contributors for making this release possible! @EdAbati, @FBruzzesi, @MarcoGorelli, @dangotbanned, @janpipek, @luke396, @skritsotalakis and @thomasjpfan
enh: Deprecate native_namespace in favour of backend in read_csv
combine_evaluate_output_names check (#2040)native_namespace in favour of backend in read_csv (#2063)_pandas_like and _arrow (#2069)DType attr access (#2025)_pandas_like and _arrow (#2069)pyright ignores (#2076)mypy strict (#2077)ExprMetadata (#2074)_pandas_like and _arrow (#2069)change_metadata_kind (#2067)CompliantSeries.dtype (#2066)_evaluate_output_names generic (#2053)ignore[attr-defined] on Datetime (#2049)kwargs from dask, dont treat ddof as expressifiable arg (#2059)CompliantExpr._version (#2060)kwargs from selector function (#2058)*.selectors (#2057)pyright to ci (#2035)marimo only in selected python version (#2043)combine_evaluate_output_names check (#2040)Thank you to all our contributors for making this release possible! @EdAbati, @FBruzzesi, @MarcoGorelli, @dangotbanned, @luke396, @osoucy and @raisadz
fix: PySpark was raising during collect when it contained no rows and a void dtype column
collect when it contained no rows and a void dtype column (#2032)is_in was raising when used with empty list (#2031)mypy & pyright errors for _arrow (#2007)Thank you to all our contributors for making this release possible! @EdAbati, @MarcoGorelli and @dangotbanned
perf: Avoid evaluating expr twice in mean_horizontal
series[other_series] (#2013)TypeGuard -> TypeIs (#2027)Array shape default (#2026)Schema.to_<backend>() in from_numpy (#2024)from_numpy to use Mapping, Sequence (#2023)from_dict to use Mapping (#2022)tool.mypy.pretty = true (#2018)set invariance (#2012)sum_horizontal with column transformation (#2009)pyspark from Windows CI (#1998)isinstance_or_issubclass (#1997)mypy pre-commit in local environment (#1966)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @EdAbati, @FBruzzesi, @MarcoGorelli, @anopsy, @camriddell, @dangotbanned and @raisadz
ci: validate tpch query results
_from_compliant_dataframe type ignore (#1969)utils.py warnings (#1968)Series._level annotation (#1967)datetime selector (#1822)Schema.to_(arrow|pandas|polars) (#1924)__get_item__ (#1958)from_native overload fixes to v1 (#1953)IntoDataFrameT in to_native to v1 (#1954)Schema.to_(arrow|pandas|polars) (#1980)series module docstrings (#1976)functions module docstrings (#1974)_arrow.dataframe warnings (#1983)np.ndarray aliases (#1977)parse_version to accept packages (#1975)series module docstrings (#1976)functions module docstrings (#1974)functions, series warnings (#1970)__getitem__ type fixes (#1963)is_compliant_* (+ friends) (#1955)Thank you to all our contributors for making this release possible! @EdAbati, @FBruzzesi, @IsaiasGutierrezCruz, @MarcoGorelli, @akmalsoliev, @camriddell, @dangotbanned and @luke396
fix: wrong argument name suggested in from_dict deprecation
is_duplicated for pyarrow (#1951)from_dict deprecation (#1946)Thank you to all our contributors for making this release possible! @FBruzzesi and @MarcoGorelli
enh: Deprecate native_namespace in favour of backend in from_dict
DataFrame.to_numpy for pandas, improve performance for DataFrame.schema for pandas, use fewer values to sniff dtype for pandas objects (#1929)native_namespace in favour of backend in from_dict (#1931)Iterator[IntoExpr] in utils.flatten (#1934)IntoDataFrameT in to_native (#1936)TypeVar/Union pairs in from_native (#1935)LazyFrame has a unique TypeVar (#1930)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @FBruzzesi, @IsaiasGutierrezCruz, @MarcoGorelli, @dangotbanned, and @raisadz
feat: add LazyFrame.explode for duckdb
LazyFrame.explode for duckdb (#1891).str.to_datetime (#1916)ModuleType and str for backend in .lazy() method (#1914)LazyFrame.unpivot for spark and duckdb (#1890)LazyFrame.collect with backend and **kwargs (#1734)dtype in nw.lit for pyspark (#1913)Thank you to all our contributors for making this release possible! @FBruzzesi, @osoucy , and @MarcoGorelli
feat: Add backend argument to lazy
backend argument to lazy (#1895)dtype.is_<x> methods (#1906).list namespace and lazyframe .explode (#1887)pointblank to Used By section (#1904)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @FBruzzesi, @MarcoGorelli, @raisadz and @rich-iannone
chore: fix pyspark/sqlframe typo
selectors.matches (#1882)_depth from DuckDBExpr and SparkLikeExpr (#1878)name namespaces to lower code duplication (#1876)Thank you to all our contributors for making this release possible! @FBruzzesi, @MarcoGorelli and @raisadz
docs: fix api completness generation in CI
nw.all, nw.nth, and selectors across the API (#1866).over() (#1867)join_asof (#1860)var and std (#1858)Struct dtype (#1851)list.len method (#1850)mean_horizontal for DuckDB (#1846)& / | operator errors for PySpark / chore: use F.lit in maybe_evaluate for pyspark, like we do for duckdb (#1872)nw.selectors.by_dtype(nw.Datetime) was excluding tz-aware for Polars (#1869)narwhals_to_native_dtype for Int32 and UInt32 (#1857)min_periods to min_samples for polars 1.21 compatibility (#1864)& / | operator errors for PySpark / chore: use F.lit in maybe_evaluate for pyspark, like we do for duckdb (#1872)PandasLikeSeries.__array__ to fix cuDF is_in (#1862)Thank you to all our contributors for making this release possible! @FBruzzesi, @MarcoGorelli and @raisadz
feat: deprecate maintain_order in Expr.unique and LazyFrame.tail (but keep around in stable.v1)
maintain_order in Expr.unique and LazyFrame.tail (but keep around in stable.v1) (#1839)eager_or_interchange from from_native in main namespace, switch Ibis' support from interchange to lazy in main namespace (but preserve status-quo in stable.v1) (#1829)is_nan and is_finite for duckdb, is_nan for pyspark (#1825)Expr.dt methods to PySpark (#1835)to_datetime (#1826).over method for SparkLikeExpr (#1808)n_unique and no aggregation (#1819)SparkExpr.cast for basic types (#1812)Expr.name namespace (#1809)AnonymousExprError (#1816)drop_nulls (#1811)DataFrame and Series to_polars (#1803)SparkLikeNamespace.when (#1805)narwhals_to_native_dtype (#1824)isinstance_or_issubclass to allow tuples (#1820)Thank you to all our contributors for making this release possible! @Dhanunjaya-Elluri, @EdAbati, @FBruzzesi, @MarcoGorelli, @luke396, @marvinl803 and @raisadz
feat: improve error message on check_columns_exist
date (#1798)dt.to_string (#1794)dt.ordinal_day (#1796)dt.weekday (#1795)SparkLikeNamespace methods (#1779)SparkLikeStrNamespace methods (#1781)all, any and null_count Spark Expressions (#1724)SparkLikeExpr and SparkLikeNamespace.lit (#1708)n_unique for DuckDB (#1762)SparkLikeExpr methods (#1721)utils.py (#1760)is_between type hint in signature (#1766)nw.when one level higher (#1756)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @Dhanunjaya-Elluri, @EdAbati, @FBruzzesi, @MarcoGorelli, @camriddell, @lucas-nelson-uiuc, @marvinl803 and @raisadz
docs: update api-completeness with duckdb
Series|Expr.rank (#1342)duckdb (#1740)cudf from tests/expr_and_series/replace_time_zone_test.py::test_replace_time_zone_none[cudf] (#1748)Thank you to all our contributors for making this release possible! @AlessandroMiola, @Dhanunjaya-Elluri, @EdAbati, @FBruzzesi, @MarcoGorelli, @anopsy
fix: always pass Column to pandas.spark.functions
weekday to Pandas, Dask and Arrow dt namespaces (#1680)Struct dtype (#1717)clip arguments (#1709)sum and sum_horizontal for SparkLike (#1693)SparkLikeLazyFrame methods (#1633)DaskLazyFrame and ArrowDataFrame .with_row_index column order (#1706)maintain_order from LazyFrame.unique (#1687)Expr method' docstrings (#1733)nw.LazyFrame docstrings examples run on Polars and Dask only (#1700)is_nan reference (#1716)Series method' docstrings (#1699)DataFrame method' docstrings (#1688)None instead of float('nan') to check for null values in tests (#1697)Thank you to all our contributors for making this release possible! @AlessandroMiola, @DeaMariaLeon, @EdAbati, @FBruzzesi, @MarcoGorelli, @camriddell, @dependabot, @dependabot[bot], @lucas-nelson-uiuc and @lucianosrp
fix: is_duplicated was returning wrong-length result for PyArrow and Dask
is_duplicated was returning wrong-length result for PyArrow and Dask (#1679)Thank you to all our contributors for making this release possible! @DeaMariaLeon and @MarcoGorelli
chore, perf: arrow cat namespace
lower_bound and upper_bound in is_between (#1672).shift(n).over('col') for pandas-like DataFrames (#1627)IntoDataFrameT/IntoFrameT in docs (#1664)cum_count, cum_max, cum_min, cum_prod, cum_sum in Series (#1673)arg_true, cast, clip, count (#1667)abs, alias, all, any methods for clarity (#1653)subset in unique one level up (#1671)nw.Expr|Series.str.contains with literal=True (#1670)__narwhals_namespace__ more (#1658)dev from extra (#1655)Thank you to all our contributors for making this release possible! @AlessandroMiola, @ClaudioSalvatoreArcidiacono, @Dhanunjaya-Elluri, @FBruzzesi, @MarcoGorelli and @luke396
perf: avoid merge in pandas groupby
DataFrame and LazyFrame explode method (#1542)maintains_order has no effect (but keep around for backwards-compatibility) (#1643)CompliantExpr (#1614)Thank you to all our contributors for making this release possible! @AlessandroMiola, @DeaMariaLeon, @Dhanunjaya-Elluri, @FBruzzesi, @MarcoGorelli, @marenwestermann and @marvinl803
perf: streamline pyarrow and pandas group by agg
Series|Expr.rolling_var and Series|Expr.rolling_std (#1451)var to Expr and Series (#1603)nw.col('a').is_in(df['b']) was raising (#1616)DataFrame, LazyFrame and Series docstrings (#1622)Thank you to all our contributors for making this release possible! @ClaudioSalvatoreArcidiacono, @DeaMariaLeon, @Dhanunjaya-Elluri, @FBruzzesi, @Machele-codez, @MarcoGorelli, @e10v, @marenwestermann and @skritsotalakis
feat: add Series and Expr arg_min & arg_max
Series and Expr arg_min & arg_max (#1529)len aggregation behaviour for depth-1 exprs (#1589)Thank you to all our contributors for making this release possible! @AlessandroMiola, @DeaMariaLeon, @Dhanunjaya-Elluri, @MarcoGorelli, @Nathan-Bransby-NMT, @e10v, @marenwestermann and @thevro
release: Bump version to 1.18.2
Thank you to all our contributors for making this release possible! @MarcoGorelli, @anopsy and @camriddell
perf: use lru_cache for native_to_narwhals_dtype
Thank you to all our contributors for making this release possible! @AlessandroMiola, @DeaMariaLeon, @MarcoGorelli, @TimOsahenru, @anopsy and @raisadz
Nothing published for this version
Nothing published for this version
ci: actually test against pandas nightly, don't filter "copy is deprecated" warnings
read_csv (#1551)ListNamespace.len() for Expr and Series (#1536).list namespace should preserve pandas index (#1538)pln.mean (#1543)series and expr to _compliant for Arrow, Polars, and Dask (#1537)Thank you to all our contributors for making this release possible! @AlessandroMiola, @DeaMariaLeon, @FBruzzesi, @Machele-codez, @MarcoGorelli, @anopsy, @marvinl803, @olp-cs and @raisadz
feat: get_native_namespace accepts native objects
Implementation.is_pandas, Implementation.is_pandas_like, and more (#1531)narwhals.dtypes.Date docstring example (#1528)Enum dtype docstring example (#1514)Object dtype docstring example (#1511)Series.to_list (#1513)_expr to _compliant_expr in PandasLikeExpr (#1527)_pandas_series to _compliant_series in PandasSeries (#1517)Thank you to all our contributors for making this release possible! @BenjaminFraser, @EdAbati, @MarcoGorelli, @camriddell, @chrisschopp, @czhanger, @munsoor, @olp-cs, @ontowhee, @reshamas and @skritsotalakis
feat: raise informative error message for DataFrame.__eq__/__neq__
Series.__contains__ (#1480)Thank you to all our contributors for making this release possible! @FBruzzesi, @MUKESHRAJMAHENDRAN, @MarcoGorelli
fix: follow left-hand-rule in index alignment in from_dict
Thank you to all our contributors for making this release possible! @FBruzzesi and @MarcoGorelli
feat: consistently return Python scalars from Series reductions for PyArrow
Series generic (#1412)lit broadcasting and output name of right arithmetic ops (#1424)from/to_native in documentation examples (#1461)Thank you to all our contributors for making this release possible! @AlessandroMiola, @EdAbati, @FBruzzesi, @MarcoGorelli and @raisadz
BUG: remove cudf from import hooks
NotImplementedError for not supported parameters in ewm_mean for cuDF (#1449)concat error message and concat docs (#1435)backend_version parameter to polars dtype translation utility (#1441)Thank you to all our contributors for making this release possible! @AlessandroMiola, @MarcoGorelli and @raisadz
feat: improve error message when casting to invalid type
Series|Expr.skew method (#1173)from narwhals.stable.v1.dependencies import works (#1430)constraints in DataFrame.filter (#1417)Expr|Series.rolling_mean method (#1290)Thank you to all our contributors for making this release possible! @CarloLepelaars, @DeaMariaLeon, @FBruzzesi, @MarcoGorelli, @gvwilson, @marenwestermann and @raisadz
feat: add Series|Expr.rolling_sum method
Thank you to all our contributors for making this release possible! @FBruzzesi, @DeaMariaLeon, and @MarcoGorelli
feat: add Series|Expr.is_finite method
Series|Expr.is_finite method (#1341)ColumnNotFoundError for missing columns in select and drop (#1389)Series|Expr.cum_prod method, add reverse kw in cum_sum method (#1386)Series|Expr cum_min and cum_max methods (#1384)Series|Expr.cum_count method (#1380)InvalidIntoExprError to mention nw.lit (#1393)IntoExpr error (#1379)ColumnNotFoundError for missing columns in select and drop (#1389)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @EdAbati, @FBruzzesi, @LiamConnors, @MarcoGorelli, @anopsy and @raisadz
chore: add issue_deprecation_warning to generate_unique_token function
with_columns (#1366)DataFrame.pivot for pandas like and Polars backend (#546)to_dummies with nulls (#1040)new_series docstring (#1365)test_to_dummies_drop_first_na for cudf (#1364)ArrowDataFrame.with_columns (#1345)Thank you to all our contributors for making this release possible! @FBruzzesi, @MUKESHRAJMAHENDRAN, @MarcoGorelli and @raisadz
perf: Prefer getitem instead of loc for selecting multiple columns in pandas-like
%Y%m%d%H%M%S (#1326)median (#1212)replace_strict method (#1340)PandasLikeDataFrame.to_dict (#1352)nw.lit out names (#1347)tabmat (#1339)Thank you to all our contributors for making this release possible! @AlessandroMiola, @DeaMariaLeon, @FBruzzesi, @IsaiasGutierrezCruz, @MarcoGorelli, @Riik, @raisadz and @sjdenny
enabled inventory for intersphinx
ArrowGroupBy.__iter__ performances (#1334)replace and replace_strict (#1327)maintain_order to Expr.unique and Series.unique (#1333)Thank you to all our contributors for making this release possible! @AlessandroMiola, @EdAbati, @FBruzzesi, @MarcoGorelli, @marenwestermann, @raisadz and @srivarra
perf: improve with_columns for pandas-like when using nw.lit
Thank you to all our contributors for making this release possible! @MarcoGorelli, @pre-commit-ci and @pre-commit-ci[bot]
Revert "depr: deprecate strict in from_native / to_native in favour of pass_through"
strict in from_native / to_native in favour of pass_through" (#1311)strict in from_native / to_native in favour of pass_through (#1308)%Y-%m-%dT%H:%M in pyarrow (#1292)narwhals_to_native_dtype raise if polars dtype is passed (#1307)to_native in favour of pass_through (#1312)Thank you to all our contributors for making this release possible! @EdAbati, @FBruzzesi, @MarcoGorelli and @raisadz
feat: support dataframe.columns for interchange level
Thank you to all our contributors for making this release possible! @MarcoGorelli and @raisadz
perf: make to_py_scalar 3x faster when argument is str
columns and select for InterchangeFrame if _df is present (#1283)from_native was sometimes raising unnecessarily with strict=False (#1274)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @FBruzzesi, @MarcoGorelli, and @raisadz
feat: add .select (by str) for duckdb and ibis backend
.select (by str) for duckdb and ibis backend (#1266)generate_temporary_column_name (#1264)Thank you to all our contributors for making this release possible! @FBruzzesi and @MarcoGorelli
perf: improve performance of Series.dtype and DataFrame.schema for pandas-like
quantile docs (#1251)Thank you to all our contributors for making this release possible! @AlessandroMiola, @FBruzzesi, @LiamConnors, @MarcoGorelli, @benrutter, and @vincentarelbundock
simplify marimo in downstream_tests.yml
to_date (#1216)_pandas_like.utils.py (#1204)maybe_evaluate_expr out of for loop in reuse_series_implementation (#1217).rows(named=False) support for cuDF data frames (#1186)Expr and stable v1 API (#1218)compare_dicts (#1224)from __future__ import annotations (#1206)Thank you to all our contributors for making this release possible! @CarloLepelaars, @DeaMariaLeon, @EdAbati, @FBruzzesi, @LiamConnors, @MarcoGorelli, @artiom-matvei, @luke396, @mscolnick, @raisadz and @schloerke
feat: add from_arrow (which uses the PyCapsule Interface)
<min|max>_horizontal (#1148)__native_namespace__ for interchange support dataframes (#1172)marimo (#1166)Thank you to all our contributors for making this release possible! @AlessandroMiola, @ChinoUkaegbu, @DeaMariaLeon, @FBruzzesi, @LiamConnors, @MarcoGorelli, @dependabot, @dependabot[bot], @lucianosrp, @luke396, @raisadz and @schloerke
enh: Add .rows(named=False) support for pyarrow
.rows(named=False) support for pyarrow (#1155)Thank you to all our contributors for making this release possible! @AlessandroMiola, @Cheukting, @MarcoGorelli, @akshayka and @schloerke
perf: Impove pandas-backend indexing
pandas-backend indexing (#993)format=None in str.to_datetime (#1145)concat_str (#1128)Thank you to all our contributors for making this release possible! @AlessandroMiola, @Cheukting, @DeaMariaLeon, @FBruzzesi, @LiamConnors, @MarcoGorelli, @aivanoved, @pre-commit-ci and @pre-commit-ci[bot]
feat: make typing available under narwhals.stable.v1
Series.str.to_datetime (#1131)nulls_last kw in dataframe sort (#1124)DataFrame.__getitem__ when slicing with tuple and null slice (#1123)test_unpivot (#1113)Thank you to all our contributors for making this release possible! @FBruzzesi, @LiamConnors, @MarcoGorelli and @raisadz
ci: add name-tests-test to pre-commit
maybe_reset_index for pandas-like dataframe or series (#1095)Datetime(time_unit, time_zone) and Duration(time_unit) types (#960)dataframe between Frame and DataFrame (#1030)PandasLikeSeries.zip_with scalar value and DaskNamespace.when (#1099)drop_nulls with subset of length>1 (#1090)narwhalify part of stable api (#1086)xfail test using None on to_numpy for cuDF (#1092)Thank you to all our contributors for making this release possible! @DeaMariaLeon, @FBruzzesi, @LiamConnors, @MarcoGorelli, @V-Alizade, @luke396 and @raisadz
feat: Initial support for nested dtypes (List, Array, Struct)
DataFrame|LazyFrame.unpivot method (#1043)to_pandas and to_arrow for interchange level of support (#1066)series.rename (#1073)nw.all() doesn't work in sum_horizontal (#1075)observed=True (#1079)get_<dependency> cleanup (#1074)Thank you to all our contributors for making this release possible! @Cheukting, @DeaMariaLeon, @FBruzzesi, @LiamConnors, @MarcoGorelli and @raisadz
[pre-commit.ci] pre-commit autoupdate
DataFrame.columns (#1010)Series.__iter__ (#1057)Series.dtype return annotation (#1049)str.len_chars (#1036)__len__ to DataFrame only (#1053)utils/check_api_reference.py (#983)test_group_by_n_unique_w_missing for cuDF (#1039)Thank you to all our contributors for making this release possible! @Cheukting, @Dosenpfand, @FBruzzesi, @HeitCunha, @Jupetus, @LiamConnors, @MarcoGorelli, @MathiasHolmstrom, @Morena1996, @TNieuwdorp, @V-Alizade, @anopsy, @gauthierpiarrette, @jeroenjanssens, @juanchodpg2, @lucianosrp, @mattcristal, @mikeweltevrede, @pre-commit-ci, @pre-commit-ci[bot], @sTomerG, @summerscope and @thomend
Bug: __getitem__ check for edge cases such as subsetting 0 rows or 0 columns
__getitem__ check for edge cases such as subsetting 0 rows or 0 columns (#994)Thank you to all our contributors for making this release possible! @LiamConnors, @MarcoGorelli, @atulchhotray, and @raisadz
Bug: add conversion from slice to array for selecting rows in pyarrow __getitem__
__getitem__ (#978)DataFrame.sample method (#975)Expr|Series.sample (#974)str_to_uppercase test (#976)Thank you to all our contributors for making this release possible! @FBruzzesi, @LiamConnors, @MarcoGorelli, @aidoskanapyanov, @luke396 and @raisadz
Bug: fix an issue with string keys in left and semi joins in Dask, add Dask to tpch benchmarks
__getitem__ (#949)Any for constructor in all tests (#962)Any type with pytest.FixtureRequest for request inputs in all tests (#961)join_asof (#959)Expr.mode with broadcast (#953)total_seconds (#951)Thank you to all our contributors for making this release possible! @FBruzzesi, @LiamConnors, @MarcoGorelli and @raisadz
support __getitem__ with single tuple of column names
__getitem__ with single tuple of column names (#935)mode method (#942)copy param on to_numpy to default to True for cuDF (#937)appears on section with links to relevant podcasts/blogs (#941)maybe_align_index (#938)to_dummies with drop_first test for cuDF (#945)Thank you to all our contributors for making this release possible! @FBruzzesi, @LiamConnors, @MarcoGorelli, @aidoskanapyanov and @raisadz
feat: implement to_arrow for cuDF
to_arrow for cuDF (#924)on key to join (#927)to_arrow for cuDF (#924)Thank you to all our contributors for making this release possible! @LiamConnors, @MarcoGorelli and @raisadz
Your coding agent can read these notes before it upgrades. Set up the MCP server →