假设数据框scoreDF
:
date time score
sec_code
1048 2015-02-25 09:21:00 28
2888 2015-02-25 09:21:00 25
945 2015-02-25 09:21:00 23
4 2015-02-25 09:21:00 22
669 2015-02-25 09:21:00 15
我需要创建一个MySQL查询来检索与scoreDF.index
中的值匹配的所有行,即sec_code
列。
通常我会去一个循环:
finalResultDF = DataFrame()
queryString = 'SELECT * FROM tableA WHERE sec_code = ' + code
for code in scoreDF.index:
queryResultDF = sql.read_sql(queryString, con)
finalResultDF.append(queryResultDF)
如果没有循环传递值列表(即scoreDF.index
作为WHERE条件),是否可以以不同方式执行此操作?我用谷歌搜索了几个小时,有些人向read_sql
提到“参数”,但我无法弄明白。
答案 0 :(得分:9)
你可以在没有任何循环的情况下实现这一点。
queryString = 'SELECT * FROM tableA WHERE sec_code in '+tuple(scoreDF.index)
这将直接给出结果。假设scoreDF.index
是list
。如果它已经是tuple
,则不需要进行类型转换。
答案 1 :(得分:0)
正如bolec_kolec建议的那样,我认为最佳实践是在调用read_sql时使用params
。这是我通常的操作方式(Python 3.7):
scoreIndex = scoreDF.index.tolist()
queryString = 'SELECT * FROM tableA WHERE sec_code = ANY(%(scoreIndex)s)'
queryParams = {'scoreIndex': scoreIndex}
queryResultDF = sql.read_sql(sql = queryString, con, params = queryParams)