首页 > 解决方案 > 如何使用 Python/Pandas for-loop 在 for-loop 中读取带有查询参数的 SQLite 文件?

问题描述

我想从 SQLite 数据库中提取一些表。这些表具有不同的行数,因此将它们存储在 Python 列表中以方便进一步的数据分析是很自然的。以下代码有效。

    import sqlite3
    import pandas as pd
    conn = sqlite3.connect("Database")
    data = []
    data.append(pd.read_sql("""SELECT ID,Time,A,B FROM Main WHERE BatchID=='BATCH1'""", conn))
    data.append(pd.read_sql("""SELECT ID,Time,A,B FROM Main WHERE BatchID=='BATCH2'""", conn))
    conn.close()
    print(data[0]['Time'])

与其为每个 BatchID 重复代码,不如使用 for 循环,例如

    conn = sqlite3.connect("Database")
    data = []
    batch = ['BATCH1', 'BATCH2']
    for k in list(range(2)): 
       data.append(pd.read_sql("""SELECT ID,Time,A,B FROM Main WHERE BatchID='eval(batch[k])'""", conn))                                       
    conn.close()
    print(data[0]['Time'])

但这不起作用。如果我尝试使用这种技术只读取一个表并显式编写 eval(batch[0]) ,那么我会得到一个只有键但没有数据的表。

根据要求,我添加了一些上下文来说明为什么我有一个 DataFrames 列表。我通常想要做的是轻松绘制一个图表,其中包含不同批次的 A 如何随时间变化的函数。感兴趣的批次集合可以是特定批次、或批次集合或全部。绘图的代码应该简单透明。

    for k in batches: ax1.plot(data[k]['Time'], data[k]['A'])

但是这个命令行可能很简单,使用在 DataFrame 中选择所有带有选定变量的批次。我认为这里也是一个概念上的简单性,我们有一个绘图列表,我们使用上面的命令覆盖在同一个图中。

我也喜欢以类似的方式计算数据子集。

JPI93 下面建议的另一种方法是简化第一步,并制作一个大型 DataFrame,其中包含来自所有批次的数据以及所选变量。这导致制作我认为所需的图表的命令有点长。代码下方

    ...
    data = pd.read_sql("""SELECT BatchID,ID,Time,A,B FROM Main""",conn)
    index = []
    index.append(data['BatchID'] == ' Batch1']
    index.append(data['BatchID'] == ' Batch2']
    batches = list(range(2))

然后我们可以使用以下命令进行绘图

    for k in batches:ax1.plot(data.loc[index[k],'Time'],data.loc[index[k],'A'])

我倾向于支持上面的原始绘图命令,但是我需要解决制作 DataFrames 列表的原始问题。还是这里有一些其他方法可以使 plot 命令简单易读?

标签: pythonpandassqlite

解决方案


如果您使用的是 Python 3.6+,请尝试格式化脚本:

conn = sqlite3.connect("Database")
data = []
batch = ['BATCH1', 'BATCH2']
for k in list(range(2)):
   query = batch[k] 
   data.append(pd.read_sql(f"""SELECT ID,Time,A,B FROM Main WHERE BatchID='{query}'""", conn))                                       
conn.close()
print(data[0]['Time'])

或者您可以使用旧式格式功能:

    data.append(pd.read_sql(f"""SELECT ID,Time,A,B 
                                FROM Main 
                                 WHERE BatchID='{}'""".format(query),
                            conn))

推荐阅读