我有一张大型Excel工作簿,其中包含大约45,000行和45列的1张工作表。我想遍历列,寻找重复项和独特的项目,并花了很长时间来浏览各个列。反正是为了优化我的代码还是让它更快?我想要打印信息或保存到txt文件。我使用openpyxl模块在Windows 10和python 2.7上:
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列中,我想提取所有重复项并将它们与唯一值分开。
答案 0 :(得分:0)
正如VedangMehta所说,熊猫会很快为你做到。
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
df_dup
进行子集来找到重复的值
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
对于唯一的calues,请使用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
答案 1 :(得分:0)
使用只读模式时,请勿使用columns属性来读取工作表。这是因为数据存储在行中,因此列需要解析器不断重新读取文件。
This is an example使用openpyxl将工作表转换为Pandas数据帧。它需要openpyxl 2.4或更高版本,在编写本文时必须检查它。