如何用Python的for循环执行SQL查询并关联结果至DataFrame
解决按app_name批量查询并匹配对应行的问题
场景说明
现有包含100个app_name的DataFrame,需对每个app_name执行SQL查询,统计对应去重R_ID的数量,并将结果匹配到原DataFrame的对应行(而非新增行/列)。
示例数据
A = ['A001', 'B001','C001','Bdd','djd.djsx'] AB = pd.DataFrame(A, columns = ['app_name'])
原DataFrame结构:
| app_name | |
|---|---|
| 0 | A001 |
| 1 | B001 |
| 2 | C001 |
| 3 | Bdd |
| 4 | djd.djsx |
基础SQL查询示例
select COUNT(DISTINCT [R_ID]) from database_view where [app_name] in ('A001')
原代码问题分析
你写的代码存在3个核心问题:
- 循环
For i in AB遍历的是DataFrame的列名,而非每行的app_name值 - SQL语句中
{i}的格式错误,未用单引号包裹值,且in后缺少括号 - 使用
append会新增行,无法实现“对应行赋值”的需求
解决方案
方案一:循环每行查询并赋值(适合小批量场景)
先新增列存储结果,再遍历每行执行查询并赋值到对应位置:
# 新增列用于存储统计结果 AB['distinct_r_id_count'] = 0 # 遍历DataFrame的每一行 for idx, row in AB.iterrows(): current_app = row['app_name'] # 格式化SQL,注意单引号包裹app_name sql = f''' select COUNT(DISTINCT [R_ID]) as count from database_view where [app_name] = '{current_app}' ''' # 执行SQL查询 query_result = pd.read_sql_query(sql, database) # 将结果赋值到对应行的指定列 AB.loc[idx, 'distinct_r_id_count'] = query_result['count'].iloc[0] print(AB)
方案二:一次性批量查询(高效,推荐100条数据场景)
避免循环执行100次SQL请求,一次性查询所有app_name的统计结果,再合并到原DataFrame:
# 生成所有app_name的SQL格式字符串(带单引号) app_list = AB['app_name'].tolist() app_sql_str = ','.join([f"'{app}'" for app in app_list]) # 批量查询SQL sql = f''' select [app_name], COUNT(DISTINCT [R_ID]) as distinct_r_id_count from database_view where [app_name] in ({app_sql_str}) group by [app_name] ''' # 执行批量查询 stats_result = pd.read_sql_query(sql, database) # 合并统计结果到原DataFrame,保证所有原行保留,无数据的填充0 AB = AB.merge(stats_result, on='app_name', how='left') AB['distinct_r_id_count'] = AB['distinct_r_id_count'].fillna(0).astype(int) print(AB)
两种方案最终都会得到符合预期的结果:每个app_name对应一行,新增列存储其去重R_ID的统计数。
内容的提问来源于stack exchange,提问作者xlxdxf
相关产品推荐
相关产品推荐

