【问题标题】:How to optimize pandas code with nested iterrows如何使用嵌套 iterrows 优化 pandas 代码
【发布时间】: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


【解决方案1】:

我认为首先找到df2[14].startswith df1[0]的行,然后制作一个df,然后使用pd.save_excel可能更有效。

但我不明白为什么要循环所有 df2 行,即使您已经找到匹配项(只需要最后一个?)。

【讨论】:

  • 感谢您的回答。这对我来说很愚蠢。我修复了我的代码,以便在找到第一个匹配项后立即中断。
猜你喜欢
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2021-12-22
  • 2019-12-21
  • 2016-04-10
相关资源
最近更新 更多