通过大数据列表的openpyxl Python迭代

我有一个大型的45000行45列的Excel工作簿。 我想遍历列寻找重复和独特的项目,并花了很长的时间去通过单个列。 有无论如何优化我的代码或使这个更快? 我要么打印信息,要么保存到txt文件。 我在Windows 10和Python 2.7中使用openpyxl模块:

from openpyxl import load_workbook, worksheet, Workbook import os #read work book to get data wb = load_workbook(filename = 'file.xlsx', use_iterators = True) ws = wb.get_sheet_by_name(name = 'file') wb = load_workbook(filename='file.xlsx', read_only=True) count = 0 seen = set() uniq = [] for cell in ws.columns[0]: if cell not in seen: uniq.append(cell) seen.add(cell) print("Unique: "+uniq) print("Doubles: "+seen) 

编辑:可以说我有5列A,B,C,D,E和10项,所以10行,5×10。 在列中,AI想要提取所有重复项并将它们与唯一值分开。

正如VedangMehta提到的,pandas会为你做的很快。

运行这个代码:

 import pandas as pd #read in the dataset: df = pd.read_excel('file.xlsx', sheetname = 'file') df_dup = df.groupby(axis=1, level=0).apply(lambda x: x.duplicated()) #save duplicated values from first column df[df_dup].iloc[:,0].to_csv("file_duplicates_col1.csv") #save unique values from first column df[~df_dup].iloc[:,0].to_csv("file_unique_col1.csv") #save duplicated values from all columns: df[df_dup].to_csv("file_duplicates.csv") #save unique values from all columns: df[df_dup].to_csv("file_unique.csv") 

有关详情,请参阅以下内容

假设你的数据集如下所示:

 df = pd.DataFrame({'a':[1,3,1,13], 'b':[13,3,5,3]}) df.head() Out[24]: ab 0 1 13 1 3 3 2 1 5 3 13 3 

您可以在每列中find重复的值:

 df_dup = df.groupby(axis=1, level=0).apply(lambda x: x.duplicated()) 

结果:

 df_dup Out[26]: ab 0 False False 1 False False 2 True False 3 False True 

您可以使用布尔数据df_dup通过对df进行子集化来查找重复的值

 df[df_dup] Out[27]: ab 0 NaN NaN 1 NaN NaN 2 1.0 NaN 3 NaN 3.0 

再次,您可以使用以下方法保存:

  #save the above using: df[df_dup].to_csv("duplicated_values.csv") 

要查看第一列中的重复值,请使用:

 df[df_dup].iloc[:,0] 

要得到

 Out[11]: 0 NaN 1 NaN 2 1.0 3 NaN Name: a, dtype: float64 

对于独特的calues,使用~这是Python的不符号。 所以你基本上是通过非重复的值对df进行子集

 df[~df_dup] Out[29]: ab 0 1.0 13.0 1 3.0 3.0 2 NaN 5.0 3 13.0 NaN 

使用只读模式时,不要使用columns属性来读取工作表。 这是因为数据存储在行中,所以列需要parsing器不断地重新读取文件。

这是一个使用openpyxl将工作表转换为Pandas数据框的例子 。 它需要openpyxl 2.4或更高,在撰写本文时,必须检查出来。