如何将Pandas中低效的apply操作转换为Polars高效实现?
把Pandas低效行操作转为Polars高效实现
原Pandas代码通过to_pandas().apply(axis=1)逐行处理pd.cut逻辑,完全浪费了Polars的矢量化性能优势。你的核心需求等价于找到每行time_bins列表中大于对应values的最小值,可以用Polars原生列表操作实现高效处理:
解决方案代码
简洁实现版本
# 构造示例DataFrame example_df = pl.DataFrame({ 'values': [0,1,2], 'time_bins': [[-1, -0.5, 0.5, 1], [0, 0.5, 1.5, 2.5], [1.5, 2.5, 3, 4.5]] }) # 生成目标列 result_df = example_df.with_columns( pl.col('time_bins') .list.filter(pl.element() > pl.col('values')) .list.min() .alias('value_time_bin') )
分步逻辑版本(便于理解)
如果需要更清晰的分步逻辑,也可以用list.eval实现:
result_df = example_df.with_columns( pl.col('time_bins') .list.eval(pl.element().filter(pl.element() > pl.col('values')).min()) .flatten() .alias('value_time_bin') )
代码说明
pl.col('time_bins').list.filter(pl.element() > pl.col('values')):对每行的time_bins列表,筛选出大于当前行values的元素.list.min():直接取筛选后列表的最小值,得到目标结果- 两种实现都是Polars原生矢量化操作,无需转成Pandas,在大数据量下性能远高于原apply方案
验证结果
运行后result_df和你提供的期望输出完全一致:
shape: (3, 3) ┌────────┬──────────────────────────┬────────────────┐ │ values ┆ time_bins ┆ value_time_bin │ │ --- ┆ --- ┆ --- │ │ i64 ┆ list[f64] ┆ f64 │ ╞════════╪══════════════════════════╪════════════════╡ │ 0 ┆ [-1.0, -0.5, 0.5, 1.0] ┆ 0.5 │ │ 1 ┆ [0.0, 0.5, 1.5, 2.5] ┆ 1.5 │ │ 2 ┆ [1.5, 2.5, 3.0, 4.5] ┆ 2.5 │ └────────┴──────────────────────────┴────────────────┘
内容的提问来源于stack exchange,提问作者sports-modelling
相关产品推荐
相关产品推荐

