如何通过SASPY的to_df()函数筛选从SAS服务器传输的数据?
在SASPY中传输数据前筛选数据的实现方案
直接通过to_df()的**kwargs传递筛选条件
SASPY的to_df()方法支持通过where参数传入SAS风格的筛选表达式,这个条件会在SAS服务器端先执行,只把符合要求的数据传输到本地Pandas,从源头减少数据量。
示例代码:
import saspy # 初始化SAS连接 sas = saspy.SASsession() # 关联目标SAS数据集 sas_table = sas.sasdata('目标表名', libref='库名') # 传入where参数筛选后转成DataFrame filtered_df = sas_table.to_df(where="年龄 > 30 AND 性别 = '女'")
这里的where值完全遵循SAS的逻辑语法,比如字符型值要用单引号包裹,逻辑运算符用AND/OR等。
复杂场景:先在SAS端生成筛选后的临时表
如果需要更复杂的数据处理(比如多表关联、聚合计算后再筛选),可以先在SAS服务器端用PROC SQL或DATA步生成临时数据集,再将这个轻量化的临时表转成DataFrame。
示例代码:
# 在SAS端执行PROC SQL生成筛选后的临时表 sas.submit(""" PROC SQL; CREATE TABLE work.temp_filtered AS SELECT 姓名, 年龄, 薪资 FROM 库名.目标表名 WHERE 薪资 > 10000 AND 部门 = '技术部'; QUIT; """) # 将临时表转为Pandas DataFrame result_df = sas.sasdata('temp_filtered', libref='work').to_df()
关于**kwargs的更多用法
除了where,你还可以通过keep/drop参数指定只保留或排除特定列,进一步压缩传输的数据体积:
# 只保留指定列+行筛选 target_df = sas_table.to_df(where="入职日期 > '01JAN2020'd", keep="姓名 部门 薪资")
内容的提问来源于stack exchange,提问作者FábioRB
相关产品推荐
相关产品推荐

