【问题标题】:More efficient code to iterate through the dataframe更有效的代码来遍历数据框
【发布时间】:2021-02-28 13:00:03
【问题描述】:

我正在尝试执行删除语句来检查表是否有任何 SKU 存在于数据框的 SKU 列中。如果是这样,它会删除该行。由于我使用 for 语句来遍历行并检查,运行程序需要很长时间才能处理 6000 行数据。

我使用了 executemany(),因为它比对 delete 语句使用 for 循环更快,但我发现很难找到检查数据框中值的替代方法。

sname = input("Enter name: ")
cursor = mydb.cursor(prepared=True)
column = df["SKU"]
data=list([(sname, x) for x in column])
query="""DELETE FROM price_calculations1 WHERE Name=%s AND SKU=%s"""
cursor.executemany(query,data)
mydb.commit()
cursor.close()

是否有更有效的代码来实现相同的目标?

【问题讨论】:

    标签: python pymysql executemany


    【解决方案1】:

    您可以先使用GET id FROM price_calculations1 WHERE Name=%s AND SKU=%s 然后使用 MYSQL WHILE 循环删除这些 id 而不需要游标,这似乎更高效。

    见:https://www.mssqltips.com/sqlservertip/6148/sql-server-loop-through-table-rows-without-cursor/


    没有前一个 get 的 WHILE 循环也可能有效。

    见:https://dev.mysql.com/doc/refman/8.0/en/while.html

    【讨论】:

      【解决方案2】:

      尝试在一次调用数据库中完成所有工作,而不是循环(此指南通常适用于处理数据库)。

      给定名称/sku 对列表:

      pairs = [(name1, sku1), (name2, sku2), ...]
      

      创建一个查询来识别所有匹配的记录并删除它们

      base_query = """DELETE FROM t1.price_calculations1 t1
                       WHERE t1.id IN (
                      SELECT t2.id FROM price_calculations1 t2
                       WHERE {})
                   """
      # Build the WHERE clause criteria
      criteria = "OR ".join(["(name = %s AND sku = %s)"] * len(pairs))
      # Create the query
      query = base_query.format(criteria)
      # "Flatten" the value pairs
      values = [i for j in pairs for i in j]
      
      cursor.execute(query, values)
      cursor.commit()
      

      【讨论】:

      • 删除关键数据时,请确保您有备份,删除时删除的记录比预期的要多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2022-11-02
      • 2022-01-12
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多