【发布时间】:2021-09-24 20:02:36
【问题描述】:
所以我有这个使用嵌套 iterrows 的代码。我读过 iterrows 比 .apply 或矢量化要慢得多。
workbook = openpyxl.load_workbook(output)
worksheet = workbook['Sheet1']
for indexA, rowA in dfA.iterrows():
nameA = rowA[0]
for indexB, rowB in dfB.iterrows():
nameB = rowB[14]
if nameB.startswith(nameA):
print(f"Found match : {nameB} starts with {nameA}")
ws[f"A{indexA}"] = indexB[1]
ws[f"B{indexA}"] = indexB[2]
ws[f"C{indexA}"] = indexB[3]
wb.save(output)
wb.close()
我不知道如何在这部分使用矢量化或应用。目前,dfA 中有 500,000 行,需要 3 多个小时。无论如何,我正在寻找加快速度。感谢您的帮助!
【问题讨论】:
-
这看起来很慢,因为您有 N x O 复杂度的嵌套循环。在比较两个数据帧时,永远不需要这样做。
-
循环写入单元格是slow in Excel VBA,因此使用Python无疑也很慢。补救措施是从数组中的 for 循环中捕获值,并在循环完成之前写出整个数组。
-
谢谢你们的帮助。我实际上让它工作得更快。使用 pandarallel 库并更改为使用 .apply 而不是嵌套 iterrows 的代码。从 5 小时缩短到 2 分钟以下
标签: python python-3.x pandas dataframe openpyxl