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

如何将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

逻辑说明

  1. 先修正了你原有代码的两个小问题:pandas读取SQL的方法是pd.read_sql_query(横杠改为下划线),同时补充了数据库连接的调用逻辑
  2. 核心分组计算逻辑对应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,求平均值的结果就是已完成记录占分组总记录的比例
  3. 如果需要调整结果的小数精度,可以在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:06:02