SQL iterate over distinct values of a column and build a data frame for each value
我有一个如下所示的表:
1 2 3 4 5 6 | |A|B|C|D| |---|---|---|---| |1|b1|c1|d1| |1|b2|c2|d2| |2|b3|c3|d3| |2|b4|c4|d4| |
我想迭代A的不同值并从剩余的列中构建一个pandas数据帧,然后使用该表进行计算。 我尝试了以下方法:
1 2 3 4 5 6 | 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()) |
这不起作用,因为构建数据帧的第二个游标对象会覆盖我正在迭代的游标对象。 我还发现你不能有两个游标对象。 我应该如何解决这个问题?
考虑使用pandas的read_sql(在传递游标值时使用参数化)并迭代地将每个数据帧保存到字典中,其中引用键是相应的不同值(dict路由避免了全局环境中的多个dfs):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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, ' ', v.head()) |
将您感兴趣的所有数据放入DataFrame(如果它不是一个庞大的数据集),然后过滤数据集。
1 2 3 4 | 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] |
有没有特别的原因你不想在熊猫本身做这整个操作? 您可以这样做:
1 2 3 | parent_df = pd.read_sql(c,"SELECT * from table") for name, group in parent_df.groupby('A'): print(name, group.head()) |
要么
1 2 | parent_df.set_index('A', inplace=True) parent_df.head(20) |
最终的解决方案是使用
我发现这篇文章也很有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
将逻辑分成两个不同块的数据帧是非常重要的。