SQL迭代列的不同值并为每个值构建数据帧

时间:2016-08-16 23:17:24

标签: python sql sqlite python-3.x pandas

我的表格如下所示:

|A|B|C|D|
|---|---|---|---|
|1|b1|c1|d1|
|1|b2|c2|d2|
|2|b3|c3|d3|
|2|b4|c4|d4|

我想迭代不同的A值并从剩余的列中构建一个pandas数据帧,然后使用该表进行计算。我尝试了以下方法:

import sqlite3
import pandas as pd
conn = sqlite3.connection('my_db.db')
c = conn.cursor()
for entry in c.execute("SELECT DISTINCT A in table):
    df = pd.DataFrame(c.execute("SELECT * FROM table WHERE A = ?", (entry[0],)).fetchall())

这不起作用,因为构建数据帧的第二个游标对象会覆盖我正在迭代的游标对象。我还发现你不能有两个游标对象。我应该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

是否有一个特殊的原因你不想在熊猫本身做这整个操作?您可以这样做:

parent_df = pd.read_sql(c, "SELECT * from table")
for name, group in parent_df.groupby('A'):
    print(name, group.head())

或者

parent_df.set_index('A', inplace=True)
parent_df.head(20)

答案 1 :(得分:1)

将您感兴趣的所有数据放入DataFrame(如果它不是一个庞大的数据集),然后过滤数据集。

df = pd.DataFrame(c.execute("SELECT * FROM table").fetchall())
distict_a = df['A'].unique()
for a in distinct_a:
    df_for_this_a = df.query[df.A == a]

答案 2 :(得分:1)

考虑使用pandas的read_sql(在传递游标值时使用参数化)并迭代地将每个数据帧保存到字典中,其中引用键是相应的不同值(dict路由避免了全局中的多个dfs)环境):

import sqlite3
import pandas as pd

conn = sqlite3.connect('my_db.db')
c = conn.cursor()

dfDict = {}
for entry in c.execute("SELECT DISTINCT A FROM table"):
    strSQL = "SELECT * FROM table WHERE A = :nameofparam"   
    dfDict[entry[0]] = pd.read_sql(strSQL, conn, params={'nameofparam': entry[0]})

c.close()
conn.close()

for k, v in dfDict.items():
    print(k, '\n', v.head())

答案 3 :(得分:0)

最终解决方案是将pandas.read_sqlchunksize

一起使用

我发现this post也很有用。

import sqlite3
import pandas as pd
conn = sqlite3.connection('my_db.db')
for df in pd.read_sql("SELECT * from table ORDER BY A ASC", conn, chunksize = 100000):
    group  = df.groupby('A')
    last   = group.first().tail(1).index.values[0]
    last_a = 0
    for a, g_df in group:
        if (a == last_a):
            g_df = l_df.append(g_df)

        ....calculations....

        if (a == last):
            l_df = g_df
            l_a  = a

将逻辑分为两组不同的数据帧,这一点非常重要。