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

如何在Polars中对两个LazyFrame按列逐元素相乘(以time为键)

在Polars中按time键实现两个LazyFrame的列-wise逐元素相乘

方法一:通过内连接(Join)实现(推荐)

如果两个LazyFrame的time列是一一对应的,直接用join匹配相同time的行,再对同名列执行逐元素相乘,完全对应Pandas中df1 * df2的逻辑,且效率更高:

# 假设df1和df2均包含time列及其他同名数据列
joined = df1.join(df2, on="time", suffix="_right")
result = joined.select(
    pl.col("time"),
    # 遍历非time列,执行相乘并保留原列名
    *[pl.col(col) * pl.col(f"{col}_right").alias(col) for col in df1.columns if col != "time"]
)

# 若为LazyFrame,可按需调用.collect()转为DataFrame
# result = result.collect()

方法二:通过concat+group_by实现(仅适用于每个time组恰好两行的场景)

你之前的concat+group_by思路需要调整聚合逻辑:pl.col("*").mul(pl.col("*"))是对列内元素自身相乘,而非组内两行对应值相乘。正确做法是提取组内两个元素再相乘:

result = pl.concat([df1, df2]).group_by("time").agg(
    *[pl.col(col).list.get(0) * pl.col(col).list.get(1).alias(col) for col in df1.columns if col != "time"]
)

注意:此方法要求每个time在两个LazyFrame中仅出现一次,否则会因组内行数不等于2导致结果错误。

为什么推荐Join方式?

Polars对Join操作做了深度优化,大数据量下性能远优于concat+group_by;同时Join逻辑更贴合「按time匹配对应行相乘」的业务意图,代码可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:28:20