通过数据帧进行迭代的更高效代码

2024-05-15 05:13:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图执行一条delete语句,检查表中是否有任何SKU存在于dataframe的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()

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


Tags: 数据程序dataframefordatacolumn语句query
2条回答

您可以首先使用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

不要循环,而是尝试在对数据库的一次调用中完成所有工作(使用数据库时,此指南通常适用)

给定名称/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()

相关问题 更多 >

    热门问题