如何将带WHERE筛选与INTO赋值的SQL转换为等效pandas代码
SAS SQL转Pandas实现方案
你需要转换的SQL是SAS方言版本,核心分为过滤、聚合、变量赋值三个部分,对应实现如下:
过滤条件(WHERE子句)实现
三个过滤规则的对应逻辑:
x=1 and y=1:用pandas布尔索引筛选两列等于1的行,多个条件用&连接,每个条件需单独加括号input(code,8.):SAS内置函数,作用是将字符型code转为8字节长度的数值类型,pandas中用pd.to_numeric实现同效转换in (70001:73599):SAS的区间简写语法,等价于数值落在[70001, 73599]闭区间内,用between方法实现即可
过滤代码:
filtered_data = _gm_Qr_bfr_mnt[ (_gm_Qr_bfr_mnt['x'] == 1) & (_gm_Qr_bfr_mnt['y'] == 1) & (pd.to_numeric(_gm_Qr_bfr_mnt['code'], errors='raise').between(70001, 73599)) ]
如果你的
code列本身已经是整数/浮点数类型,可以跳过pd.to_numeric转换,直接对code列调用between方法。
聚合计算+变量赋值(INTO子句)实现
SAS中select 聚合1,聚合2 into :变量1,:变量2的逻辑是按聚合顺序把结果赋值给对应宏变量,pandas中直接在过滤后的数据集上计算后赋值即可:
# 对应count(*)结果,赋值给_cnt_ML_2R _cnt_ML_2R = filtered_data.shape[0] # 对应sum(days)结果,赋值给_pd_QL_1R _pd_QL_1R = filtered_data['days'].sum() # 如果需要和你之前的写法保持一致返回pd.Series类型,包装一层即可 # _cnt_ML_2R = pd.Series(filtered_data.shape[0]) # _pd_QL_1R = pd.Series(filtered_data['days'].sum())
完整代码
import pandas as pd # 行过滤 filtered_data = _gm_Qr_bfr_mnt[ (_gm_Qr_bfr_mnt['x'] == 1) & (_gm_Qr_bfr_mnt['y'] == 1) & (pd.to_numeric(_gm_Qr_bfr_mnt['code']).between(70001, 73599)) ] # 结果赋值 _cnt_ML_2R = filtered_data.shape[0] _pd_QL_1R = filtered_data['days'].sum()
内容的提问来源于stack exchange,提问作者anjan paul
相关产品推荐
相关产品推荐

