为什么选Polars
做数据分析的人几乎都用过Pandas,但当数据量达到几百万行时,Pandas会变慢甚至内存溢出。Polars是Rust编写的高性能DataFrame库,API和Pandas很像,但速度通常快10倍以上,内存占用也更低。
第一步:安装与基础读取
安装很简单:
pip install polars
读取CSV:
import polars as pl
df = pl.read_csv("data.csv")
print(df.shape)
Polars默认infer schema,读取大文件时可以用lazy模式延迟执行,减少内存占用。
第二步:Lazy模式处理大数据
Lazy模式是Polars的杀手锏。它不立即执行,而是先构建执行计划,再优化后运行:
df = pl.scan_csv("big_data.csv")
result = df.filter(pl.col("age") > 18).group_by("city").agg(pl.col("income").mean()).collect()
scan_csv不会把整个文件读进内存,filter和group_by会被优化执行,适合GB级数据。
第三步:常用数据清洗操作
Polars的链式API很直观:
- 去重:df.unique()
- 填充缺失值:df.fill_null(0)
- 重命名列:df.rename({"old":"new"})
- 新增列:df.with_columns((pl.col("a")+pl.col("b")).alias("c"))
- 类型转换:df.with_columns(pl.col("date").str.to_date())
这些操作的语法和Pandas略有不同,但熟悉后会更简洁。
第四步:分组聚合与窗口函数
Polars的分组聚合性能很强:
df.group_by("category").agg([
pl.col("sales").sum().alias("total_sales"),
pl.col("sales").mean().alias("avg_sales"),
pl.col("order_id").count().alias("order_count")
])
窗口函数也很方便,比如计算每个品类内的排名:
df.with_columns(pl.col("sales").rank(method="dense").over("category").alias("category_rank"))
第五步:与Pandas/可视化结合
Polars可以无缝转回Pandas:
pdf = df.to_pandas()
转Pandas后可以接matplotlib、seaborn、plotly做可视化。也可以直接用Polars的绘图扩展,但生态还不如Pandas成熟。
常见误区
- 小数据也用Lazy模式——数据不大时直接eager更直观
- 完全放弃Pandas——Pandas生态更丰富,两者结合用最好
- 不注意数据类型——Polars对类型要求严格,类型不对会报错
效率数据
实测读取1GB CSV并做过滤+分组聚合:Pandas约需45秒,Polars eager模式约8秒,Lazy模式约5秒。内存占用Polars约为Pandas的30%-50%。对于日常几十万到几千万行的数据处理,Polars是性价比极高的选择。