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

Polars:在with_columns的filter中如何引用外部LazyFrame列?

解决Polars LazyFrame中按月份均值修正指定条件price的问题

你原来的写法里,df.filter(...)是对整个LazyFrame做过滤,里面的列引用只能指向filter内部的数据集,没法关联外层当前行的月份值,所以得换用更适配LazyFrame逻辑的方式,下面给两种可行方案:

方案一:窗口函数(推荐,简洁高效)

直接用over窗口函数,为每一行计算对应月份的price均值,无需额外关联操作:

df = df.with_columns(
    pl.when(pl.col('need_ratio') == 1)
      .then(pl.col('price') / pl.col('price').mean().over(pl.col('datetime').dt.month()))
      .otherwise(pl.col('price'))
      .alias('price')
)

pl.col('price').mean().over(pl.col('datetime').dt.month())会自动按当前行的月份分组,计算该组的price均值,完美适配惰性计算的逻辑。

方案二:分组聚合后关联(适合复杂场景)

先单独计算每个月份的price均值,再通过月份字段关联回原表,完成修正:

# 计算各月份的price均值
monthly_mean = df.group_by(pl.col('datetime').dt.month().alias('month'))
                 .agg(pl.col('price').mean().alias('monthly_price_mean'))

# 关联并修正price列
df = df.join(monthly_mean, left_on=pl.col('datetime').dt.month(), right_on='month')
       .with_columns(
           pl.when(pl.col('need_ratio') == 1)
             .then(pl.col('price') / pl.col('monthly_price_mean'))
             .otherwise(pl.col('price'))
             .alias('price')
       )
       .drop('month', 'monthly_price_mean')  # 清理临时生成的列

内容的提问来源于stack exchange,提问作者thanksgivingmeal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:12:38