pandas的read_sql,包含WHERE条件的值列表

时间:2015-02-26 05:37:39

标签: python mysql pandas

假设数据框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提到“参数”,但我无法弄明白。

2 个答案:

答案 0 :(得分:9)

你可以在没有任何循环的情况下实现这一点。

queryString = 'SELECT * FROM tableA WHERE sec_code in '+tuple(scoreDF.index)

这将直接给出结果。假设scoreDF.indexlist。如果它已经是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)