本文共 5435 字,大约阅读时间需要 18 分钟。
前言:
介绍一个用 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 为读取的所有数据
# 删除的重复数据
(
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
:
]
)
(
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 的第三方模块,如:xlwt,xlrd,python-docx等,操作 Office 办公软件(Word Excel PPT)的方法进行详细讲解。同时也会搭配一些实例演练,一方面强化知识点的理解与运用,另一方面也希望能起到,引导读者进行思考:如何用 python 提高 offic 办公软件办公效率的作用。
感兴趣的朋友,可以点个 关注 或 收藏 。如在博客中遇到任何问题或想法,可留言或私信。
创作不易,你的支持是我最大的动力,感谢 !
转载地址:https://blog.csdn.net/weixin_39603908/article/details/110776778 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!