Narwhals:DataFrame 库的轻量兼容层
文章目录NarwhalsDataFrame 库的轻量兼容层NarwhalsDataFrame 库的轻量兼容层Narwhals 是一个 Python DataFrame 兼容层目前已获得 1,626 个 StarNarwhals 的定位是在多个 DataFrame 库之间提供统一的 API 调用方式。开发者写一次代码就能在 pandas、Polars、DuckDB、PyArrow 等库之间切换。目前 Narwhals 完整支持 cuDF、Modin、pandas、Polars 和 PyArrow。对 Daft、Dask、DuckDB、Ibis、PySpark 和 SQLFrame 提供 Lazy 模式支持。Narwhals 的核心特点如下使用 Polars API 的子集不需要学习新的接口零依赖只使用用户传入的库不会增加项目体积区分 eager 和 lazy 两种 API支持表达式兼容 pandas 的类型系统和索引不会干扰原有逻辑100% 分支覆盖率每天针对 pandas 和 Polars 的 nightly 版本进行测试开销极低几乎不会带来性能损耗完整的静态类型支持IDE 可以给出准确提示向后兼容策略明确提供 stable API 供选择安装很简单通过 pip 直接安装pip install narwhals也可以使用 condaconda install -c conda-forge narwhals使用 Narwhals 只需要三个步骤。先用narwhals.from_native把 pandas、Polars 等 DataFrame 包装成 Narwhals 对象。然后调用 Narwhals 支持的 Polars API 子集进行数据处理。最后用narwhals.to_native把结果转回原始的 DataFrame 类型。以下是一个完整的示例importnarwhalsasnwfromnarwhals.typingimportIntoFrameTdefagnostic_function(df_native:IntoFrameT)-IntoFrameT:return(nw.from_native(df_native).with_columns(categorynw.when(nw.col(animal).str.contains(whale)).then(nw.lit(whale)).otherwise(nw.lit(other))).to_native())这个函数可以同时接受 pandas.DataFrame、polars.DataFrame、duckdb.DuckDBPyRelation 等多种类型。计算过程始终在原库内完成不需要额外的依赖。importduckdbimportpolarsasplimportpandasaspd data{animal:[blue whale,orca,dolphin,humpback whale,seal],length_m:[30.0,8,2.5,17,2.2],weight_kg:[150000,4000,200,30000,85],}df_plpl.DataFrame(data)print(agnostic_function(df_pl))df_pdpd.DataFrame(data)print(agnostic_function(df_pd))输出结果保持各库原生格式。Polars 返回 Polars 的 DataFramepandas 返回 pandas 的 DataFrame。这个项目已经被 altair、bokeh、plotly、marimo 等多个库采用。如果你正在维护一个需要兼容多种 DataFrame 后端的 Python 库Narwhals 是一个值得考虑的方案。lotly、marimo 等多个库采用。如果你正在维护一个需要兼容多种 DataFrame 后端的 Python 库Narwhals 是一个值得考虑的方案。