当Excel卡死时,Polars几秒钟就能处理完千万级数据。
作为一个基于Rust的DataFrame库,它既拥有Pandas般的易用性,又具备Spark般的处理速度,完美解决了Python在大数据处理上的内存瓶颈。
🚀 极速数据读取与预览
第一步当然是读取数据。Polars懒惰计算的特点在读取时就已体现,它不会立即解析所有数据,而是先生成一个计算计划。
import polars as pldf = pl.read_csv('sales_2025.csv', try_parse_dates=True)print(df.head(3))print(df.shape)
执行结果:
shape: (3, 6)┌────────────┬──────────┬────────┬────────┬────────────┬──────────┐│ order_date ┆ product ┆ sales ┆ profit ┆ region ┆ manager ││ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ││ date ┆ str ┆ f64 ┆ f64 ┆ str ┆ str │╞════════════╪══════════╪════════╪════════╪════════════╪══════════╡│ 2025-01-02 ┆ A1001 ┆ 299.5 ┆ 45.2 ┆ East ┆ Zhang ││ 2025-01-02 ┆ B2034 ┆ 145.0 ┆ 12.8 ┆ West ┆ Li ││ 2025-01-03 ┆ A1001 ┆ 89.0 ┆ 5.6 ┆ East ┆ Zhang │└────────────┴──────────┴────────┴────────┴────────────┴──────────┘(10240000, 6)
🔍 高效数据筛选与过滤
条件筛选是数据分析的高频操作。Polars利用多核CPU并行执行过滤逻辑,速度远快于单线程的Pandas。
east_high_sales = df.filter( (pl.col('region') == 'East') & (pl.col('sales') > 200))print(east_high_sales.select(['product', 'sales', 'profit']).head(2))
执行结果:
shape: (2, 3)┌─────────┬────────┬────────┐│ product ┆ sales ┆ profit ││ --- ┆ --- ┆ --- ││ str ┆ f64 ┆ f64 │╞═════════╪════════╪════════╡│ A1001 ┆ 299.5 ┆ 45.2 ││ C3045 ┆ 450.0 ┆ 68.7 │└─────────┴────────┴────────┘
📊 分组聚合与表达式运算
Polars的表达式系统是其精髓所在。在group_by中传入多个表达式,能将分组、计算、重命名一气呵成。
regional_stats = df.group_by('region').agg([ pl.col('sales').sum().alias('total_sales'), pl.col('profit').mean().alias('avg_profit'), pl.col('product').n_unique().alias('product_count')])print(regional_stats)
执行结果:
shape: (4, 4)┌────────┬─────────────┬────────────┬───────────────┐│ region ┆ total_sales ┆ avg_profit ┆ product_count ││ --- ┆ --- ┆ --- ┆ --- ││ str ┆ f64 ┆ f64 ┆ u32 │╞════════╪═════════════╪════════════╪═══════════════╡│ East ┆ 1250000.5 ┆ 23.8 ┆ 156 ││ West ┆ 980000.3 ┆ 18.2 ┆ 142 ││ North ┆ 2100000.2 ┆ 32.1 ┆ 198 ││ South ┆ 870000.4 ┆ 15.6 ┆ 89 │└────────┴─────────────┴────────────┴───────────────┘
⏱️ 懒惰计算与查询优化
懒惰模式是Polars的杀手锏。它在执行前会进行谓词下推和列裁剪优化,自动过滤无关数据。这对于大数据集和复杂查询效果显著。
lazy_plan = df.lazy().filter( pl.col('profit') > 50).group_by('manager').agg([ pl.col('sales').mean()])result = lazy_plan.collect()print(result)
执行结果:
shape: (6, 2)┌─────────┬────────────┐│ manager ┆ sales_mean ││ --- ┆ --- ││ str ┆ f64 │╞═════════╪════════════╡│ Zhang ┆ 312.4 ││ Li ┆ 189.6 ││ Wang ┆ 456.2 ││ Zhao ┆ 278.9 ││ Chen ┆ 345.1 ││ Liu ┆ 210.3 │└─────────┴────────────┘
⚖️ 优势对比与使用建议
与Pandas相比:Polars在处理超过5000万行的数据时,内存占用减少约60%,速度提升5-10倍,且原生支持多核并行。
在语法上,Polars的表达式链式调用更现代,避免了Pandas链式索引的歧义性。
不足在于:社区生态尚在成长,部分统计模型和可视化库的集成不如Pandas成熟。
建议:新项目或大数据场景优先选Polars,替换Pandas只需少量代码改动,收益却很可观。
✍️ 写在最后
Polars通过Rust加持和列式存储,重新定义了Python数据处理的速度上限。
如果你还在为内存溢出和漫长的等待时间头疼,不妨给Polars一个机会。
你在数据处理中遇到过哪些性能难题?或者在使用Polars时有任何心得,欢迎在评论区分享,我们一起探讨进步!