在Polars中实现分组后组内元素减组均值的等效代码(对应Pandas实现)
在Polars中实现分组后组内元素减组均值的等效代码(对应Pandas实现)
嘿,我来帮你搞定这个Polars的等效代码问题!
你在Pandas里的代码是对b、c列做组内(按a分组)的均值中心化——也就是每列的元素减去对应组的均值,最后把结果替换回原列对吧?在Polars里,因为它是表达式优先的设计,所以不能直接像Pandas那样用DataFrame的sub方法,得用表达式语法来实现,不过其实更简洁高效。
直接给你两种可行的写法:
写法一:逐个列定义表达式
import polars as pl # 假设你的Polars DataFrame叫df df = df.with_columns( (pl.col("b") - pl.col("b").mean().over("a")).alias("b"), (pl.col("c") - pl.col("c").mean().over("a")).alias("c") )
写法二:批量处理列更简洁
如果要处理的列比较多,用列表推导式批量生成表达式更省事:
df = df.with_columns( [pl.col(col) - pl.col(col).mean().over("a") for col in ["b", "c"]] )
为什么这么写?
这里的核心是over("a")——它相当于告诉Polars:计算mean()的时候,要按a列的值分组来算。然后我们把原列减去这个组内均值,用alias指定原来的列名,这样就会直接替换原DataFrame里的b、c列,最终输出的就是和你Pandas代码结果一致的完整DataFrame,而不是分组后的版本。
你之前尝试用sub遇到问题,是因为Polars的DataFrame方法更偏向于表达式输入,而上面这种写法完全贴合Polars的设计思路,还能充分发挥它的向量化性能优势~
备注:内容来源于stack exchange,提问作者p__10
相关产品推荐
相关产品推荐

