openpyxl Python 遍历大数据列表

openpyxl Python Iterating Through Large Data List

我有一个很大的 excel 工作簿,其中 1 个 sheet 大约有 45,000 行和 45 列。我想遍历各列以查找重复项和唯一项,并且需要很长时间才能遍历各个列。有没有办法优化我的代码或让它运行得更快?我要么想打印信息,要么保存到 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 行,5x10。在 A 列中,我想提取所有重复项并将它们与唯一值分开。

正如 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]:
    a   b
0   1  13
1   3   3
2   1   5
3  13   3

您可以找出每列中重复的值:

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

结果:

df_dup

Out[26]:
       a      b
0  False  False
1  False  False
2   True  False
3  False   True

您可以通过使用布尔数据框 df_dup

df 进行子集化来找到重复值
df[df_dup]
Out[27]:
     a    b
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

对于唯一值,请使用 ~,即 Python 的非符号。所以你本质上是用不重复的值 df 子集

df[~df_dup]

Out[29]:
      a     b
0   1.0  13.0
1   3.0   3.0
2   NaN   5.0
3  13.0   NaN

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

This is an example 使用 openpyxl 将工作表转换为 Pandas 数据帧。它需要 openpyxl 2.4 或更高版本,在撰写本文时必须签出。