我是Python的新手。目前,我需要计算重复项的数量,删除重复项并将重复项的情况更新到新列中。下面是我的代码:
import pandas as pd
from openpyxl import load_workbook
filepath = '/Users/jordanliu/Desktop/test/testA.xlsx'
data = load_workbook(filepath)
sku = data.active
duplicate_column = []
for x in range(sku.max_row):
duplicate_count = 0
for i in range(x):
if sku.cell(row =i + 2, column = 1).value == sku.cell(row = x + 2, column = 1).value:
duplicate_count = duplicate_column[i] + 1
sku.cell(row =i+2, column = 1).value = 0
duplicate_column.append(duplicate_count)
for x in range(len(duplicate_column)):
sku.cell(row=x + 2, column=3).value = duplicate_column[x]
for y in range(sku.max_row):
y = y + 1
if sku.cell(row = y, column = 1).value == 0:
sku.delete_rows(y,1)
data.save(filepath)
我尝试使用这两种熊猫,但由于执行时间非常长,我决定改用 openpyxl,但它似乎没有多大帮助。其他帖子中的许多人建议使用CSV,但由于这是花费大部分时间的写作过程,我认为它不会有太大帮助。 有人可以在这里为我提供一些帮助吗?
for x in range(sku.max_row):
duplicate_count = 0
for i in range(x):
if sku.cell(row =i + 2, column = 1).value == sku.cell(row = x + 2, column = 1).value:
duplicate_count = duplicate_column[i] + 1
sku.cell(row =i+2, column = 1).value = 0
对于此部分,您将一遍又一遍地重新检查相同的值。假设这些应该是完全唯一的,这就是我认为你的代码是如何编写的,那么你应该实现一个哈希类型(dict 或 set(的缓存来执行这些后续查找,而不是每次都通过sku.cell
进行查找。
所以它会像这样:
xl_cache = {}
duplicate_count = {}
delete_set = set()
for x in range(sku.max_row):
x_val = sku.cell(row = x, column = 1).value
if x_val in xl_cache: # then this is not first time
xl_cache[x_val][1] += 1 # increase duplicate count
delete_set.add(x)
else:
xl_cache[x_val] = x # key is value for duplicate cache, value is row number
duplicate_count[x] = 0 # key is row number, value is duplicate count
因此,现在您有一本带有重复计数的原始词典,您需要返回并删除您不想要的行并更改工作表中的重复计数。因此,请向后浏览范围并删除行或更新重复计数。您可以通过先转到最大值并减少 1,先检查删除,否则更改重复项来执行此操作。
y = sku.max_row
for i in range(y, 0, -1):
if i in delete_set:
sku.delete_rows(i,1)
else:
sku.cell(row=i, column=3) = duplicate_count[i]
从理论上讲,这总共只会遍历您的范围两次,并且从缓存中查找的平均值为 O(1(。您需要反向遍历它,以便在删除行时保持行顺序。
由于我实际上没有您的示例数据,因此我无法完全测试此代码,因此可能会出现小问题,但我尝试使用代码中的结构来使其易于使用。