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

如何用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
0A001
1B001
2C001
3Bdd
4djd.djsx

基础SQL查询示例

select COUNT(DISTINCT [R_ID]) 
from database_view
where [app_name] in ('A001')

原代码问题分析

你写的代码存在3个核心问题:

  1. 循环For i in AB遍历的是DataFrame的列名,而非每行的app_name值
  2. SQL语句中{i}的格式错误,未用单引号包裹值,且in后缺少括号
  3. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:00:27