如何在Python pandas中执行包含partition by的SQL查询
Python pandas实现带窗口函数的SQL查询方案
pandasql报错是因为其底层依赖的低版本SQLite不支持窗口函数,推荐直接使用pandas原生方法实现,性能更优,具体步骤如下:
- 第一步:执行左连接,匹配SQL的LEFT JOIN逻辑
import pandas as pd # sales1、sales2为你已有的两个DataFrame merge_df = pd.merge( left=sales1, right=sales2, on=["sale", "d_id", "month", "p_id"], how="left", suffixes=("", "_right") # 处理两表重名冲突,右表重复列加_right后缀 )
- 第二步:计算分组的vol1总和,对应SQL中
sum(vol1) over (partition by ...)的窗口逻辑groupby+transform会将分组聚合结果广播到分组内的每一行,和窗口函数效果完全一致:
merge_df["group_vol1_sum"] = merge_df.groupby(["sale", "d_id", "month", "p_id"])["vol1"].transform("sum")
- 第三步:计算目标字段vol_r、vol_t,可添加除零逻辑避免报错
# 将总和为0的情况替换为NA,避免除零错误 merge_df["group_vol1_sum"] = merge_df["group_vol1_sum"].replace(0, pd.NA) merge_df["vol_r"] = merge_df["vol1"] / merge_df["group_vol1_sum"] merge_df["vol_t"] = merge_df["vol2"] * merge_df["vol1"] / merge_df["group_vol1_sum"] # 可选:删除中间计算列,得到最终结果 result = merge_df.drop(columns=["group_vol1_sum"])
如果你坚持使用pandasql执行SQL,可将底层SQLite版本升级到3.25及以上,该版本开始原生支持窗口函数语法。
内容的提问来源于stack exchange,提问作者NITIN KOTHARI
相关产品推荐
相关产品推荐

