Python与Excel表格综合实例四:对 Excel 表格内数据进行去重、分类,异常处理及分析

前言:

主要实现代码及思路:

1、主要思路:

2、读取数据函数:

3、数据去重函数:

4、数据分类函数:

5、查找异常数据:

6、数据分析函数:

7、汇总异常数据及数据分析数据函数:

8、创建标记样式函数:

9、写入Excel表格函数:

主代码:

结尾:

【Python与Office】专栏

前言:

介绍一个用 Python 实现对 Excel 表格中的数据进行去重、分类、标记异常数据等功能的实例。

虚拟文件简介:

有一份电商数据的 Excel 表格数据,该数据中有部分字段缺失和数据异常,表格部分数据如下:


数据下载地址:示例数据下载地址(注:因实例演示需要,数据有删改,操作Excel文件可私信或留言咨询。)

具体需求:

1、数据去重: 读取所有数据,对数据中每个字段内容都一致的数据删除;

2、数据分类: 按分类二对数据进行分类,将每类数据写入不同的sheet表中;

3、异常处理: a:标记商品名称为空,市场价、店铺价、数量为NA的数据(红色字体); b: 标记店铺价大于市场价的数据(橙色字体);

4、数据分析: 找出每类商品中(按分类三)市场价与商品价差距最大的数据,并加粗斜体、蓝色字体显示;

5:用函数封装完成上述需求的代码。

最终完成效果图:


主要实现代码及思路:

1、主要思路:

实现上述需求的主体思路为:

第一步: 先获取到Excel的所有数据,因为每一行数据是一条独立数据,所以读取数据的方式为按行读取;

第二步: 去除重复数据,遍历读取到的数据,如果数据全部字段都相同则删除重复数据。

这里有一个问题,是先查找异常数据还是先对数据进行分类?

考虑到需要在新建的Excel表格里标记异常数据,所以先对数据按分类二字段分类,再对分类后的数据进行异常处理会好更简单一点。

第三步: 按分类二字段对数据分类,以字典数据结构存放分类数据。再对每类数据进行异常处理及数据分析,因需要是要标记异常值及分析后数据值,所以异常分析函数和数据分析函数只记录异常数据和数据分析结果数据的索引值。

第四步: 创建异常数据和分析结果数据标记的样式表,将数据写入Excel表格。先按分类二创建不同的sheet表写入数据,再对每一类数据的异常数据按创建的样式重写数据。

以下是实现上述分析的具体函数:

2、读取数据函数:
模块导入:
import xlrd
import xlwt
用 xlrd 模块按行读取文件数据:
# 读取数据方法
def read_data(path):
# 打开Excel文件,获取sheet对象
work_book = xlrd.open_workbook(path)
sheet = work_book.sheet_by_index(0)
# 按行获取所有数据
all_data = sheet._cell_values
return all_data
3、数据去重函数:
数据去重函数:主要模拟pandas模块dataframe 里对数据去重的方法。
主要思路为:
1、先创建一个将放入bool值的 tag 列表;
2、创建一个中间列表存放临时查重值;
3、遍历需查重对象,没有重复的放入临时列表,tag 列表增加 True 值;
4、重复对象不放入临时列表,tag 列表增加 False 值;
5、根据 tag 列表提取查重对象无重复对象和重复对象。
代码:
# 数据去重
def del_duplication(data):
tags = [] #
m = []
for ds in data:
if ds not in m:
m.append(ds)
tags.append(True)
else:
tags.append(False)
clean_data = [ds for i,ds in enumerate(data)
if tags[i]]
del_data = [ds for i,ds in enumerate(data)
if not tags[i]]
del m
return clean_data,del_data
测试:
c_data,d_data = del_duplication(data) # data 为读取的所有数据
# 删除的重复数据
print(d_data)
打印截图:

4、数据分类函数:
依据 Excel 文件中 分类2 字段对数据进行分类:
# 数据分类
def classify_data(data):
class_data = {}
for ds in data:
if ds[2] not in class_data.keys():
class_data[ds[2]] = [ds]
else:
class_data[ds[2]].append(ds)
return class_data
测试:
d2 = classify_data(c_data[1:])
print(d2.keys())
# 打印结果
# dict_keys(['男装', '男鞋'])
按分类2进行分类时,数据被分为 2 类:男装、男鞋。
5、查找异常数据:
异常数据有两种,情形一:是数据为空或为NA值,情形二:店铺价大于市场价。
筛选情形一异常值函数:
# 查找异常数据,缺失数据、NA数据
def strange_data(data):
strange_index = []
for i,ds in enumerate(data):
# 数据为空时
if ds[0] == '':
strange_index.append(i)
# 数据为NA 值时
elif ds[5] == 'NA':
strange_index.append(i)
elif ds[6] == 'NA':
strange_index.append(i)
elif ds[7] == 'NA':
strange_index.append(i)
return strange_index
注:返回的是异常数据在所有数据中的索引值。
筛选情形二异常值函数:
# 店铺价大于商场价的数据
def strange_data_2(data):
strange_index = []
for i,ds in enumerate(data):
try:
if float(ds[6]) > float(ds[5]):
strange_index.append(i)
except:
pass
return strange_index
注:因数据的商场价或店铺价可能为NA值,所以这里用 try 捕捉下异常情况。
6、数据分析函数:
按分类三,查找每类商品中市场价与商品价差距最大的数据:
# 数据分析
def analysis_data(data):
# 按分类 3 分类对数据进行分类
class_3_data = list(set([ds[3] for ds in data]))
max_index = []
for tag in class_3_data:
middle_ = {}
for i,ds in enumerate(data):
if ds[3] == tag:
try:
middle_[i] = float(ds[5])-float(ds[6])
except:
middle_[i] = 0
max_value = max(middle_.values())
max_index += [key for key in middle_ if middle_[key] == max_value]
return max_index
注:数据分析和异常处理共三个函数,可以好好理一下里面的思路。
7、汇总异常数据及数据分析数据函数:
# 汇集异常数据、及数据分析后数据信息
def data_index(data):
data_dict = {}
for key in data.keys():
# 缺失数据索引
index_1 = strange_data(data[key])
# 店铺价大于商场价的数据索引
index_2 = strange_data_2(data[key])
# 数据分析结果索引
index_3 = analysis_data(data[key])
data_dict[key] = [index_1,index_2,index_3]
return data_dict
8、创建标记样式函数:
# 建立样式
def styles():
# 红色字体
style1 = xlwt.XFStyle()
font1 = style1.font
font1.colour_index = 0x0A
# 橙色字体
style2 = xlwt.XFStyle()
font2 = style2.font
font2.colour_index = 0x35
# 加粗斜体蓝色字体
style3 = xlwt.XFStyle()
font3 = style3.font
font3.italic = True
font3.bold = True
font3.colour_index = 0x0C
return style1,style2,style3
不清楚如何用 xlwt 模块设置单元格样式可参考:单元格格式、字体格式、对齐方式、边框等设置方法
9、写入Excel表格函数:
# 将数据写入Excel表格
def create_excel(data,labels,data_index,file_name):
# 建立字体格式
s1,s2,s3 = styles()
styles_ = [s1,s2,s3]
# 建立工作薄
work_book = xlwt.Workbook()
for key in data.keys():
# 建立sheet表,打开单元格重写
sheet = work_book.add_sheet(key,cell_overwrite_ok = True)
# 在sheet表中写入行标签
for col_,label in enumerate(labels):
sheet.write(0,col_,label)
# 先按默认格式写入所有数据
for row,ds in enumerate(data[key]):
for col,d in enumerate(ds):
sheet.write(row+1,col,d)
# 再按标记索引重写被标记的数据
for i,ixs in enumerate(data_index[key]):
for ix in ixs:
for col,d in enumerate(data[key][ix]):
sheet.write(ix+1,col,d,styles_[i])
work_book.save(file_name)
注:这里在创建sheet表时 add_sheet(key,cell_overwrite_ok = True) 重写设置需打开。
主代码:
if __name__ == '__main__':
data = read_data('test01.xls')
c_data,d_data = del_duplication(data)
heads = c_data[0]
d2 = classify_data(c_data[1:])
ixs = data_index(d2)
new_excel = create_excel(d2,heads,ixs,'new.xls')

创建的 new.xls 文件截图:

异常数据标记效果图:


按分类三分类计算的商场价与店铺价差价最大的标记效果图:


结尾:

以上就是本篇博客的全部内容了,如有不清楚的地方可查看往期博客,感谢阅读。

【Python与Office】专栏

该专栏会对 Python 的第三方模块,如:xlwt,xlrd,python-docx等,操作 Office 办公软件(Word Excel PPT)的方法进行详细讲解。同时也会搭配一些实例演练,一方面强化知识点的理解与运用,另一方面也希望能起到,引导读者进行思考:如何用 python 提高 offic 办公软件办公效率的作用。