You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:05:19