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
相关产品推荐
相关产品推荐

