如何将SQL分组聚合查询转换为等效的Pandas DataFrame操作语法
完整实现代码
import pyodbc import pandas as pd def connect_to_db(): conn = pyodbc.connect(r'DRIVER={SQL Server};SERVER=tcp:SQLDCB301P.uhn.ca\SQLDCB301P;DATABASE=imucsigrp' r';UID=imucsigrp_data_team;PWD=Kidney123!') return conn def completion_metric(): # 获取数据库连接 conn = connect_to_db() # 读取原始数据,read_sql_query本身返回DataFrame,无需额外转换 df = pd.read_sql_query( 'SELECT Short_ID, Status FROM PROMIS_LT_Long_ID', conn ) # 核心分组统计逻辑,和SQL逻辑完全对应 result = df.groupby('Short_ID', as_index=False)['Status'].agg( completion_metric=lambda x: (x == 'Completed').mean() ) # 关闭数据库连接 conn.close() return result
逻辑说明
- 先修正了你原有代码的两个小问题:pandas读取SQL的方法是
pd.read_sql_query(横杠改为下划线),同时补充了数据库连接的调用逻辑 - 核心分组计算逻辑对应SQL的聚合规则:
groupby('Short_ID', as_index=False)对应SQL的GROUP BY Short_ID,as_index=False保证Short_ID作为普通列返回,不会变成索引lambda x: (x == 'Completed').mean()完全等价于SQL的SUM(IIF(Status = 'Completed', 1, 0)) / COUNT(Status):布尔判断结果中True对应1、False对应0,求平均值的结果就是已完成记录占分组总记录的比例
- 如果需要调整结果的小数精度,可以在agg方法后追加
.round(小数位数)即可
如果你偏好更贴近SQL分步写法的语法,也可以用下面的代码实现完全一致的效果:
result = df.assign( completed_flag = df['Status'] == 'Completed' ).groupby('Short_ID', as_index=False).agg( completion_metric = ('completed_flag', 'mean') )
内容的提问来源于stack exchange,提问作者Ruva
相关产品推荐
相关产品推荐

