cx_Oracle中循环中大型数据集的SQL字典追加



我正在尝试将字典附加在一起,然后使用"from_dict";从cx_Oracle中获得最终返回的数据,正如我所听说的,这比从SQL中附加每个返回的行更有效。然而,我的循环仍然需要很长时间(结束循环返回一个非常大的数据库,每个循环都获得一个ID的数据,每个ID返回大约12000行——循环中有700多个ID(。我如何利用";from_dict";所以速度加快了?我不认为这是最有效的方法,因为我现在已经编写了代码。有什么建议吗?谢谢

有没有更有效的方法?使用concat而不是append

for iteration, c in enumerate(l, start = 1):
total = len(l)
data['SP_ID'] = c
data['BEGIN_DATE'] = BEGIN_DATE
print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
cursor.arraysize = 1000000
cursor.prefetchrows = 2
cursor.execute(sql, data)
cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
df_row = cursor.fetchall()
if len(df_row) == 0:
pass
else:
a = {k: [d[k] for d in df_row] for k in df_row[0]} # Here is where I combine dictionaries, but this is for only dataset pulling from SQL.I want to combine all the dictionaries from each loop to increase efficiency.
AMI_data = pd.DataFrame.from_dict(a)
#AMI.append(AMI_data)
#final_AMI_data = pd.concat(AMI)
# final_data.dropna(inplace = True)
# UPDATED
final_AMI_data = pd.DataFrame()
for iteration, c in enumerate(l, start = 1):
total = len(l)
data['SP_ID'] = c
data['BEGIN_DATE'] = BEGIN_DATE
print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
cursor.arraysize = 1000000
cursor.prefetchrows = 2
cursor.execute(sql, data)
cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
df_row = cursor.fetchall()
if len(df_row) == 0:
pass
else:
AMI_data = pd.DataFrame.from_records(df_row)
final_AMI_data.append(AMI_data, ignore_index = False)
# final_data.dropna(inplace = True)

如果您已经有了dict风格的游标工厂,则不需要重新创建字典。(顺便说一句,关于如何制作更好的,请参阅此答案。(

假设您的df_rows在获取所有行后是这样的,其中"X"one_answers"Y"是查询结果的示例列名:

[{'X': 'xval1', 'Y': 'yval1'},
{'X': 'xval2', 'Y': 'yval2'},
{'X': 'xval3', 'Y': 'yval3'}]

1.然后使用.from_records()创建数据帧:

pd.DataFrame.from_records(df_rows)

输出:

X      Y
0  xval1  yval1
1  xval2  yval2
2  xval3  yval3

这样,您就不需要重组结果来与from_dict()一起使用。

2.如果您想继续将每组12000个结果添加到同一个DataFrame中,请使用DataFrame.append()ignore_index=True将每组新结果添加到现有数据帧中。

最好只是附加到数据帧中,而不是创建一个越来越大的dictionary来最终创建一个df。


如果不清楚,else:中删除这两行

a = {k: [d[k] for d in df_row] for k in df_row[0]}
AMI_data = pd.DataFrame.from_dict(a)

并将其替换为:

AMI_data = pd.DataFrame.from_records(df_row)
# and then to add it to your final:
final_AMI_data.append(AMI_data, ignore_index=True)

相关内容

  • 没有找到相关文章

最新更新