Changes
- ci: downstream test for formulaic (1817)
- docs: Removed class, added polars to the table, str.head and str.tail are a… (1801)
✨ Enhancements
- feat: deprecate `maintain_order` in `Expr.unique` and `LazyFrame.tail` (but keep around in `stable.v1`) (1839)
- feat: track whether expressions change length but don't aggregate, and only allow length-changing expressions if they're followed by aggregations in the lazy API (1828)
- feat: add DuckDB: nw.nth, nw.sum_horizontal, nw.concat_str, group_by with drop_null_keys (1832)
- feat: remove `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)
- feat: add `is_nan` and `is_finite` for duckdb, `is_nan` for pyspark (1825)
- chore: rename time zone tests (1830)
- feat: Deprecate Expr.arg_true (but keep Series.arg_true, and keep both available in stable.v1) (1827)
- feat: add `Expr.dt` methods to `PySpark` (1835)
- feat: add pyspark str namespace `to_datetime` (1826)
- feat: add total duration methods for DuckDB (1831)
- feat: add `.over` method for `SparkLikeExpr` (1808)
- feat: pyspark group by `n_unique` and no aggregation (1819)
- feat: Disallow order-dependent expressions from being passed to nw.LazyFrame (1806)
- feat: add `SparkExpr.cast` for basic types (1812)
- feat: pyspark and duckdb `Expr.name` namespace (1809)
- feat: add `AnonymousExprError` (1816)
- feat: deprecate Expr.head, Expr.tail, Expr.sort, Expr.gather_every, Expr.sample (but keep them in stable.v1) (1791)
- feat: add duckdb dataframe `drop_nulls` (1811)
- feat: add `DataFrame` and `Series` `to_polars` (1803)
- feat: add support for `SparkLikeNamespace.when` (1805)
🐞 Bug fixes
- fix: when/then/otherwise output name was not consistent across backends (1833)
- fix: raise on shape mismatch in filter (1814)
- patch: fix when-then double lit case (1810)
🛠️ Other improvements
- chore: simplify imports (1838)
- test: fixup test suite for cudf.pandas (1837)
- test: decouple pyspark constructor from pandas (1834)
- chore: refactor pandas-like `narwhals_to_native_dtype` (1824)
- chore: refactor `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