narwhals-datafusion
Apache DataFusion backend for
Narwhals, registered through the
narwhals.plugins entry point.
pip install narwhals-datafusion # core
pip install "narwhals-datafusion[extra-functions]" # + mode, skew, kurtosis
Usage
import narwhals as nw
import pyarrow as pa
from datafusion import SessionContext
ctx = SessionContext()
df = ctx.from_arrow(pa.table({"a": [1, 2, 3], "b": ["x", "y", "x"]}))
lf = nw.from_native(df) # nw.LazyFrame on this backend
result = (
lf.group_by("b")
.agg(nw.col("a").sum())
.sort("b")
.collect(backend="pyarrow")
)
Everything is lazy until .collect(): expressions become datafusion.Expr,
frame verbs become datafusion.DataFrame methods, and DataFusion executes the
plan. Dtypes are pyarrow end-to-end. A longer tour, extra included:
docs/playground.ipynb.
Compatibility
- Python
>=3.10; tested on 3.12. datafusion>=54,<55: capped at the tested major; a release moves the cap.narwhals>=2.25: floor only; tested on 2.25, thenarwhals/submodule.datafusion-extra-functions-ffi>=0.1(extra): each shim minor pins its datafusion major.- Weekly,
compat.yml(the badge): both suites on the newest narwhals release inside the datafusion cap, extra included.
Architecture
A subclass of narwhals' SQL layer (narwhals._sql, narwhals._compliant),
the layer DuckDB, Ibis and Spark also use.
| Module | Class |
|---|---|
dataframe.py |
DataFusionLazyFrame: frame verbs over datafusion.DataFrame |
expr.py |
DataFusionExpr: the SQLExpr hooks, aggregates, windows, casts |
namespace.py |
DataFusionNamespace: SQLNamespace primitives, IO, horizontal functions |
group_by.py, selectors.py, expr_str/dt/list/struct.py |
supporting surface |
utils.py |
function-name remapping, window/sort builders, dtype bridge via narwhals._arrow |
API coverage
narwhals 2.25 on datafusion 54. ⚠️ entries work with the caveat in parentheses.
| Namespace | ✅ Supported | ⚠️ Partial | ❌ Not supported |
|---|---|---|---|
Expr |
abs alias all any any_value ceil clip cos count cum_count cum_max cum_min cum_sum diff exp fill_nan first floor is_between is_close is_duplicated is_finite is_first_distinct is_in is_last_distinct is_nan is_null is_unique last len log max mean median min null_count over pipe rank rolling_mean rolling_std rolling_sum rolling_var round shift sin sqrt std sum var |
cast (no Enum) · fill_null (no strategy + limit) · kurtosis ([extra-functions] extra) · mode ([extra-functions] extra, keep="any" only) · n_unique (not over windows) · replace_strict (explicit default required) · skew ([extra-functions] extra) |
cum_prod quantile |
Expr.str |
contains ends_with head len_chars pad_end pad_start replace_all slice split starts_with strip_chars strip_chars_end strip_chars_start tail to_date to_lowercase to_time to_uppercase zfill |
to_datetime (explicit format required) · to_titlecase (no word breaks on digits) |
replace (use replace_all) |
Expr.dt |
convert_time_zone date day hour microsecond millisecond minute month nanosecond ordinal_day second to_string truncate weekday year |
replace_time_zone (None/"UTC" only) |
offset_by timestamp total_microseconds total_milliseconds total_minutes total_nanoseconds total_seconds |
Expr.list |
contains get len max min sort |
unique (maintain_order=False only) |
mean median sum |
Expr.struct |
field |
||
LazyFrame |
collect collect_schema drop drop_nulls filter group_by head join rename select sort top_k unique unpivot with_columns with_row_index |
explode (single column) · sink_parquet (file path only) |
join_asof |
mode,skewandkurtosisneed theextra-functionsextra. It installs datafusion-extra-functions-ffi, a prebuilt wheel of thedatafusion-extra-functionscrate. Without it the three raiseNotImplementedError.- Not in the table:
Expr.filter,Expr.drop_nulls,Expr.unique,Expr.map_batches,Expr.ewm_mean,LazyFrame.tail,LazyFrame.gather_every. Narwhals does not support them on any lazy backend.
Known limitations
- Row order is guaranteed only after
sort;concatmay interleave inputs. nw.scan_csv/nw.scan_parquetcannot dispatch to a plugin yet (narwhals gap); read with aSessionContextand pass the frame tonw.from_native.
Release files for narwhals-datafusion 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| narwhals_datafusion-0.1.4.tar.gz | 25.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| narwhals_datafusion-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 53.9 kB
Release files / narwhals_datafusion-0.1.4.tar.gz
| Download URL | narwhals_datafusion-0.1.4.tar.gz |
|---|---|
| Size | 25.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
adcf484b9c5a61fc55617838469846c756b08d7b6371d9985aaaccd813534339
|
|
BLAKE2b-256 checksum How to use checksums |
144539d3c4188210cb984ddab18522ab052ccc12fc132186247ee27dbaa8fff2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 9, 2026.
Transparency logRelease files / narwhals_datafusion-0.1.4-py3-none-any.whl
| Download URL | narwhals_datafusion-0.1.4-py3-none-any.whl |
|---|---|
| Size | 29.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
290f4ad7936857e7313030838ad5f8c9cc5922aa265b5645184511e13884f02f
|
|
BLAKE2b-256 checksum How to use checksums |
6b5ec95fdef314fb6113502f26b5dfecd2cf320ffe4b92d02b282131d23b7a5d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 9, 2026.
Transparency log