我正在尝试将字典附加在一起,然后使用"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)