Extremely lightweight and extensible compatibility layer between dataframe libraries!
Seamlessly support all, without depending on any!
Get started!
Join the party!
Feel free to add your project to the list if it's missing, and/or chat with us on Discord if you'd like any support.
pip install narwhals
conda install -c conda-forge narwhals
There are three steps to writing dataframe-agnostic code using Narwhals:
narwhals.from_native
to wrap a pandas/Polars/Modin/cuDF/PyArrow
DataFrame/LazyFrame in a Narwhals classuse narwhals.to_native
to return an object to the user in its original
dataframe flavour. For example:
See the tutorial for several examples!
If you said yes to both, we'd love to hear from you!
Narwhals is 100% independent, community-driven, and community-owned. We are extremely grateful to the following organisations for having provided some funding / development time:
If you contribute to Narwhals on your organization's time, please let us know. We'd be happy to add your employer to this list!
Narwhals has been featured in several talks, podcasts, and blog posts:
Talk Python to me Podcast Ahoy, Narwhals are bridging the data science APIs
Python Bytes Podcast Episode 402, topic #2
Super Data Science: ML & AI Podcast
Narwhals: For Pandas-to-Polars DataFrame Compatibility
Sample Space Podcast | probabl
How Narwhals has many end users ... that never use it directly. - Marco Gorelli
The Real Python Podcast Narwhals: Expanding DataFrame Compatibility Between Libraries
Pycon Lithuania
Marco Gorelli - DataFrame interoperatiblity - what's been achieved, and what comes next?
Pycon Italy
How you can write a dataframe-agnostic library - Marco Gorelli
Polars Blog Post
Polars has a new lightweight plotting backend
Quansight Labs blog post (w/ Scikit-Lego)
How Narwhals and scikit-lego came together to achieve dataframe-agnosticism
Thanks to Olha Urdeichuk for the illustration!