在之前的案例使用网络爬虫自动抓取图书信息中,我们通过简单的爬虫抓取了当当网的机器学习相关的图书数据,并保存为 ./input/books_total.csv 文件。通过爬虫采集原始数据,但是由于各种原因,原始数据往往会存在许多问题,例如数据格式不正确,数据存在冗余等等。因此第一手获得的原始数据不能直接使用,需要进行数据清洗。本案例基于爬取的书籍数据进行数据清洗,使其称为符合我们要求的数据。
1.读取数据
首先,我们借助 Pandas 包提供的 read_csv 方法读取原始数据,将其转换成 Pandas 中的 DataFrame 格式。注意由于数据中包含中文,需要正确设置字符编码。
import pandas as pd
data = pd.read_csv('./input/books_total.csv',encoding="utf8",sep="\t")
通过 shape 属性可以查看数据的行数和列数。
data.shape
(600, 5)
查看数据的前5行。
data.head()
书名  | 出版信息  | 当前价格  | 星级  | 评论数  | |
0  | 机器学习  击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著...  | 周志华 /2016-01-01 /清华大学出版社  | ¥66.00  | width: 90%;  | 76149条评论  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | [美]哈林顿 /2013-06-01 /人民邮电出版社  | ¥46.30  | width: 90%;  | 25256条评论  | 
2  | 机器学习实战:基于Scikit-Learn和TensorFlow  被称为机器学习图书*强的...  | (法)奥雷利安・杰龙(Aurélien Géron)  /2018-08-27 /机械工业出版社  | ¥83.30  | width: 90%;  | 5759条评论  | 
3  | 机器学习理论导引  | 周志华 王魏 高尉 张利军 /2020-05-30  /机械工业出版社  | ¥62.30  | width: 100%;  | 783条评论  | 
4  | 机器学习――原理、算法与应用  全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度...  | 雷明 /2019-09-01 /清华大学出版社  | ¥39.60  | width: 90%;  | 1184条评论  | 
可以看出原始数据中有许多问题,例如当前价格带有人民币符号'¥',评论数含有文本等等。在本案例中我们按照步骤完成数据清洗,主要任务为:
- 1)去掉当前价格这一列中的 '¥' 符号,转换成数值格式。
 - 2) 星级列转换成数字格式,取值范围为{0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5}。例如
width:90%先转换为0.9,然后以最高星分数5乘以0.9最终得到4.5。 - 3)对于评论数这一列直接提取数值。
 - 4)出版信息分为三列分别是作者、出版日期、出版社。
 - 5)将原始数据中的书名拆分为为书名和简介两列。
 
2.提取价格数值
首先我们处理价格、星级、评论数,这几个比较简单,对于价格最主要的目的是提取数据中的数值,但真实数据除了数值还包含其他的内容,我们可以使用正则匹配将数值提取出来。
正则表达式是一种按照特定规则搜索文本的方法。在正则表达式中\d表示数字,+表示匹配前一个字符1次或无限次,常见的正则表达式符号含义见下表所示。

在Python中,re 包实现了正则表达式的匹配,常用的 search 函数能够完成匹配。下面我们编写 get_numers 函数用来提取一个字符串中的数值。
import re #导入 re 包
def get_numers(x):
regex_num = "\d{1,4}\.{0,1}\d{0,2}" #编写匹配数字的正则表达式
return float(re.search(regex_num,x)[0]) # 调用 re.search 函数进行匹配
get_numers("¥66.00")
66.0
使用DataFrame的map方法对当前价格这一列的每一个数据遍历执行,并取代原来的列。
data['当前价格'] = data['当前价格'].map(get_numers)
data.head()
书名  | 出版信息  | 当前价格  | 星级  | 评论数  | |
0  | 机器学习  击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著...  | 周志华 /2016-01-01 /清华大学出版社  | 66  | width: 90%;  | 76149条评论  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | [美]哈林顿 /2013-06-01 /人民邮电出版社  | 46.3  | width: 90%;  | 25256条评论  | 
2  | 机器学习实战:基于Scikit-Learn和TensorFlow  被称为机器学习图书*强的...  | (法)奥雷利安・杰龙(Aurélien Géron)  /2018-08-27 /机械工业出版社  | 83.3  | width: 90%;  | 5759条评论  | 
3  | 机器学习理论导引  | 周志华 王魏 高尉 张利军 /2020-05-30  /机械工业出版社  | 62.3  | width: 100%;  | 783条评论  | 
4  | 机器学习――原理、算法与应用  全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度...  | 雷明 /2019-09-01 /清华大学出版社  | 39.6  | width: 90%;  | 1184条评论  | 
data['当前价格'].sample(10)
495    53.40
92     54.50
535    49.16
581    81.20
325    69.10
473    69.00
547    55.31
587    44.60
225    46.60
211    68.80
Name: 当前价格, dtype: float64
可以看出价格这一列的数值全部提取出来了。
3.提取评论数
由于评论是也是提取数值,因此对于评论数使用同样的方法处理,具体如下。
data['评论数'] = data['评论数'].map(get_numers)
data.head()
书名  | 出版信息  | 当前价格  | 星级  | 评论数  | |
0  | 机器学习  击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著...  | 周志华 /2016-01-01 /清华大学出版社  | 66  | width: 90%;  | 76149  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | [美]哈林顿 /2013-06-01 /人民邮电出版社  | 46.3  | width: 90%;  | 25256  | 
2  | 机器学习实战:基于Scikit-Learn和TensorFlow  被称为机器学习图书*强的...  | (法)奥雷利安・杰龙(Aurélien Géron)  /2018-08-27 /机械工业出版社  | 83.3  | width: 90%;  | 5759  | 
3  | 机器学习理论导引  | 周志华 王魏 高尉 张利军 /2020-05-30  /机械工业出版社  | 62.3  | width: 100%;  | 783  | 
4  | 机器学习――原理、算法与应用  全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度...  | 雷明 /2019-09-01 /清华大学出版社  | 39.6  | width: 90%;  | 1184  | 
data['评论数'].sample(10)
87      143.0
204     834.0
392       0.0
440       0.0
378       0.0
142    1677.0
246       1.0
102     323.0
186     740.0
347       0.0
Name: 评论数, dtype: float64
可以看到评论数这一列的数值也成功提取出来了,不过它是float类型,我们需要将其转换成int类型。
data["评论数"] = data["评论数"].astype("int")
data["评论数"] .head()0    76149
1    25256
2     5759
3      783
4     1184
Name: 评论数, dtype: int64
4.转换星级
对于星级,首先要提取出数值,然后对数值进行计算,计算方法为用提取后的数值除以20,就得到最终的星级。对应关系如下表:
原始数据  | 数值  | 星级  | 
width: 0%;  | 0  | 0  | 
width: 10%;  | 10  | 0.5  | 
width: 20%;  | 20  | 1  | 
width: 30%;  | 30  | 1.5  | 
width: 40%;  | 40  | 2  | 
width: 50%;  | 50  | 2.5  | 
width: 60%;  | 60  | 3  | 
width: 70%;  | 70  | 3.5  | 
width: 80%;  | 80  | 4  | 
width: 90%;  | 90  | 4.5  | 
width: 100%;  | 100  | 5  | 
data['星级'] = data['星级'].map(get_numers)/20
data.head()
书名  | 出版信息  | 当前价格  | 星级  | 评论数  | |
0  | 机器学习  击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著...  | 周志华 /2016-01-01 /清华大学出版社  | 66  | 4.5  | 76149  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | [美]哈林顿 /2013-06-01 /人民邮电出版社  | 46.3  | 4.5  | 25256  | 
2  | 机器学习实战:基于Scikit-Learn和TensorFlow  被称为机器学习图书*强的...  | (法)奥雷利安・杰龙(Aurélien Géron)  /2018-08-27 /机械工业出版社  | 83.3  | 4.5  | 5759  | 
3  | 机器学习理论导引  | 周志华 王魏 高尉 张利军 /2020-05-30  /机械工业出版社  | 62.3  | 5.0  | 783  | 
4  | 机器学习――原理、算法与应用  全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度...  | 雷明 /2019-09-01 /清华大学出版社  | 39.6  | 4.5  | 1184  | 
data.sample(10)
书名  | 出版信息  | 当前价格  | 星级  | 评论数  | |
587  | Python+Spark  2.0+Hadoop机器学习与大数据实战 浅显易懂的原理介绍加上...  | 林大贵 /2018-01-01 /清华大学出版社  | 44.6  | 4.0  | 1258  | 
364  | 机器学习系统设计:Python语言实现 [美]  戴维・朱利安(David Julian)机...  | [美] 戴维・朱利安(David Julian)  /2017-06-01 /机械工业出版社  | 59.25  | 0 .0  | 0  | 
430  | 【新华书店】机器学习实战 [美] Peter  Harrington 著,李锐,*,曲亚东,...  | [美] Peter Harrington 著,李锐,李鹏,  /2013-06-01 /人民...  | 63.37  | 0.0  | 0  | 
370  | 机器学习与R语言(原书第2版),机械工业出版社【新华书店全新正品】  『新华书店闪电发货!限...  | (美)布雷特・兰茨(Brett Lantz)  /2017-03-01 /机械工业出版社  | 61.4  | 0  | 0  | 
513  | 精通机器学习 基于R 第2版 考瑞・莱斯米斯特尔  人民邮电出版社 978711547778...  | [美]考瑞・莱斯米斯特尔 /2018-03-01  /人民邮电出版社  | 49  | 0 .0  | 2  | 
208  | Python大数据与机器学习实战  算法多、代码多、注释多、案例多,凝聚作者十余年开发和培训...  | 谢彦 /2020-04-01 /电子工业出版社  | 59.5  | 5 .0  | 104  | 
176  | Python机器学习 Python机器学习实战教程  人工智能图书 Python程序员进阶图...  | [印]阿布舍克・维贾亚瓦吉亚(Abhishek  Vijayvargia) /2019-02-...  | 35.2  | 5.0  | 342  | 
579  | 同济博士论丛――基于机器学习的蛋白质相互作用与功能预测  | 邓磊/关佶红 /2018-05-16 /同济大学出版社  | 58.4  | 0  | 15  | 
101  | 机器学习算法框架实战:Java和Python实现  以一个自研机器学习算法框架的构建为主线,...  | 麦嘉铭 /2020-07-16 /机械工业出版社  | 47.6  | 0.0  | 114  | 
452  | 机器学习与R语言,机械工业出版社, Brett Lantz  著,李洪成,许金炜,李舰 译 ...  | (美)兰兹 著,李洪成,许金炜,李舰 译  /2015-03-01 /机械工业出版社  | 52  | 0.0  | 0  | 
5.获取出版信息
接下来我们处理出版信息这一列,从原始数据中可以看到,这一列主要包含三个信息,分别是作者、出版日期、出版社。它们以/分隔,并且存放在一个数据单元中,因此我们将它们分别取出,然后单独存为三列。
5.1 提取作者
从原始数据中可以看出以/分隔的第一个数据是作者,因此我们可以直接提取。
使用字符串的split方法可以对字符串按照特定字符分割,并且分割后是列表形式,例如:
test = '周志华/2016-01-01/清华大学出版社'
test.split('/')
['周志华', '2016-01-01', '清华大学出版社']
对出版信息这一列的每一个数据按照/分隔后取第一个数据就是作者,提取后我们将它保存在作者这一列。
data['作者'] = data['出版信息'].map(lambda x:x.split('/')[0])data.head()
书名  | 出版信息  | 当前价格  | 星级  | 评论数  | |
0  | 机器学习  击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著...  | 周志华 /2016-01-01 /清华大学出版社  | 66  | 4.5  | 76149  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | [美]哈林顿 /2013-06-01 /人民邮电出版社  | 46.3  | 4.5  | 25256  | 
2  | 机器学习实战:基于Scikit-Learn和TensorFlow  被称为机器学习图书*强的...  | (法)奥雷利安・杰龙(Aurélien Géron)  /2018-08-27 /机械工业出版社  | 83.3  | 4.5  | 5759  | 
3  | 机器学习理论导引  | 周志华 王魏 高尉 张利军 /2020-05-30  /机械工业出版社  | 62.3  | 5  | 783  | 
4  | 机器学习――原理、算法与应用  全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度...  | 雷明 /2019-09-01 /清华大学出版社  | 39.6  | 4.5  | 1184  | 
可以看到作者已经提取出来。
5.2提取出版社
采样正则表达式匹配出版社信息,正则表达式为 (\S{1,10}出版社) 。下面我们实现 get_publisher 函数,从出版信息列找那个提取出版社信息。
def get_publisher(x):
regex_pub = "/(\S{1,10}出版社)"
pub_match_result = re.search(regex_pub,x)
if pub_match_result != None:
return pub_match_result[1].strip()
else:
return ""
get_publisher("周志华王魏高尉张利军/2020-05-30/机械工业出版社")
'机械工业出版社'
在数据中新增 出版社 一列。
data['出版社'] = data['出版信息'].map(get_publisher)
data['出版社'].sample(10)
188    机械工业出版社
83     清华大学出版社
534    人民邮电出版社
115    人民邮电出版社
108    电子工业出版社
308    电子工业出版社
436    电子工业出版社
229    清华大学出版社
233    清华大学出版社
197    人民邮电出版社
Name: 出版社, dtype: object
如上所示,我们成功地提取了每个数据的出版社。
5.3提取出版日期
出版日期的格式为 YYYY-MM-DD ,对应的正则表达式为 (\d{4}-\d{2}-\d{2}) 。
def get_pubdate(x):
regex_date = "/(\d{4}-\d{2}-\d{2})"
pubdate_match_result = re.search(regex_date,x)
if pubdate_match_result != None:
return pubdate_match_result[1].strip()
else:
return ""
get_pubdate("周志华王魏高尉张利军/2020-05-30/机械工业出版社")
'2020-05-30'
新增 出版日期 列,并借助 pd.to_datetime 方法将字符串格式的时间转换成时间格式。
data['出版日期'] = pd.to_datetime( data['出版信息'].map(get_pubdate))
data['出版日期'] .sample(10)
13    2015-04-01
228   2020-06-01
230   2018-01-01
504   2017-07-01
8     2019-08-12
490   2020-06-25
148   2018-05-01
358   2018-01-01
370   2017-03-01
593          NaT
Name: 出版日期, dtype: datetime64[ns]
如上所示,我们已经成功提取作者、出版社、出版日期,因此原始的出版信息这一列可以删除。
del data["出版信息"]
data.head()
书名  | 当前价格  | 星级  | 评论数  | 出版社  | 出版日期  | ||
0  | 机器学习  击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著...  | 66  | 4.5  | 76149  | 周志华  | 清华大学出版社  | 2016/1/1  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | 46.3  | 4.5  | 25256  | [美]哈林顿  | 人民邮电出版社  | 2013/6/1  | 
2  | 机器学习实战:基于Scikit-Learn和TensorFlow  被称为机器学习图书*强的...  | 83.3  | 4.5  | 5759  | (法)奥雷利安・杰龙(Aurélien Géron)  | 机械工业出版社  | 2018/8/27  | 
3  | 机器学习理论导引  | 62.3  | 5  | 783  | 周志华 王魏 高尉 张利军  | 机械工业出版社  | 2020/5/30  | 
4  | 机器学习――原理、算法与应用  全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度...  | 39.6  | 4.5  | 1184  | 雷明  | 清华大学出版社  | 2019/9/1  | 
观察数据后发现,此时已经没有出版信息这一列,说明我们已经删除成功,现在只剩下书名这一列需要处理。
6.提取书名和书简介
书名信息中混合这书的简介信息,观察原始数据中书名一列,能找到一些规律。除去最开始可能包含的一些包含在 【】和 [] 中间的标注信息,剩余的内容中书名和其他内容基本是由空格隔开的。所以我们首先将【】和 [] 去掉,然后按照空格分隔字符串,第一个内容便是书名。实现方法如下:
def get_book_name(x):
x = x.strip()
x = re.sub("【.*?】","",x)
x = re.sub("\[.*?\]","",x)
return x.split(" ")[0]
get_book_name("【全2册】机器学习 周志华著+机器学习与应用 雷明著 全新正版 2本书")
'机器学习'
data["书名称"] = data["书名"].map(get_book_name)
data.sample(10)
书名  | 当前价格  | 星级  | 评论数  | 出版社  | 出版日期  | 书名称  | ||
33  | 白话机器学习算法 机器学习算法工程师入门教程  算法及数据科学入门图书 涵盖回归分析 神经网...  | 34.5  | 4  | 402  | [新加坡] 黄莉婷 苏川集  | 人民邮电出版社  | 2019/2/1  | 白话机器学习算法  | 
425  | 机器学习实战+美团机器学习实践  人工智能机器学习经典教程基于Python代码  | 149.85  | 0  | 0  | 绍  | 人民邮电出版社  | 2014/5/1  | 机器学习实战+美团机器学习实践  | 
288  | 【全2册】图解深度学习+图解机器学习  | 81  | 0  | 12  | 暂无  | 人民邮电出版社  | 2018/5/1  | 图解深度学习+图解机器学习  | 
545  | 实用机器学习  苏尼拉・格拉普蒂(SunilaGollapudi)著,张世武 机械工业出版社...  | 73  | 0  | 0  | 苏尼拉・格拉普蒂(SunilaGollapudi)著,张世武  | 机械工业出版社  | 2018/6/1  | 实用机器学习  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | 46.3  | 4.5  | 25256  | [美]哈林顿  | 人民邮电出版社  | 2013/6/1  | 机器学习实战人工智能开发图书  | 
250  | 数据产品经理高效学习手册 产品设计、技术常识与机器学习  讲述产品经理的数据产品设计思维框架...  | 29.5  | 5  | 144  | 张威  | 人民邮电出版社  | 2020/4/1  | 数据产品经理高效学习手册  | 
426  | 【新华书店rt】机器学习算法,[意]朱塞佩・博纳科尔索(Giuseppe  Bonaccor...  | 63.42  | 0  | 0  | [意]朱塞佩・博纳科尔索(Giuseppe Bonaccor  | 机械工业出版社  | 2018/5/1  | 机器学习算法,朱塞佩・博纳科尔索(Giuseppe  | 
249  | AI前沿深度强化学习与分布式机器学习 套装共2册  微软亚洲研究院机器学习研究团队所著,刘铁...  | 129.7  | 0  | 0  | 刘驰,刘铁岩,等  | 机械工业出版社  | 2020/8/21  | AI前沿深度强化学习与分布式机器学习  | 
401  | 机器学习与R语言 (美)布雷特・兰茨(Brett  Lantz)机械工业出版社 因书籍批量采...  | 69.3  | 0  | 0  | (美)布雷特・兰茨(Brett Lantz)  | 机械工业出版社  | 2017/3/1  | 机器学习与R语言  | 
176  | Python机器学习 Python机器学习实战教程  人工智能图书 Python程序员进阶图...  | 35.2  | 5  | 342  | [印]阿布舍克・维贾亚瓦吉亚(Abhishek  Vijayvargia)  | 人民邮电出版社  | 2019/2/1  | Python机器学习  | 
得到书名后,剩余的内容便是简介。
data["简介"] = data["书名"].map(lambda x:x.replace(get_book_name(x),""))
data.sample(5)
书名  | 当前价格  | 星级  | 评论数  | 出版社  | 出版日期  | 书名称  | 简介  | ||
0  | 机器学习  击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著...  | 66  | 4.5  | 76149  | 周志华  | 清华大学出版社  | 2016/1/1  | 机器学习  | 击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著,全面揭...  | 
1  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | 46.3  | 4.5  | 25256  | [美]哈林顿  | 人民邮电出版社  | 2013/6/1  | 机器学习实战人工智能开发图书  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | 
2  | 机器学习实战:基于Scikit-Learn和TensorFlow  被称为机器学习图书*强的...  | 83.3  | 4.5  | 5759  | (法)奥雷利安・杰龙(Aurélien Géron)  | 机械工业出版社  | 2018/8/27  | 机器学习实战:基于Scikit-Learn和TensorFlow  | 被称为机器学习图书*强的存在!前谷歌工程师撰写,“美亚”人工智能图书畅销榜首图书!从实践...  | 
3  | 机器学习理论导引  | 62.3  | 5  | 783  | 周志华 王魏 高尉 张利军  | 机械工业出版社  | 2020/5/30  | 机器学习理论导引  | |
4  | 机器学习――原理、算法与应用  全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度...  | 39.6  | 4.5  | 1184  | 雷明  | 清华大学出版社  | 2019/9/1  | 机器学习――原理、算法与应用  | 全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度学习的原理与应用  | 
提取出书名称和简介信息后,我们可以将数据中的原始书名列删除。
del data["书名"]
data.head()
当前价格  | 星级  | 评论数  | 出版社  | 出版日期  | 书名称  | 简介  | ||
0  | 66  | 4.5  | 76149  | 周志华  | 清华大学出版社  | 2016/1/1  | 机器学习  | 击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著,全面揭...  | 
1  | 46.3  | 4.5  | 25256  | [美]哈林顿  | 人民邮电出版社  | 2013/6/1  | 机器学习实战人工智能开发图书  | 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数...  | 
2  | 83.3  | 4.5  | 5759  | (法)奥雷利安・杰龙(Aurélien Géron)  | 机械工业出版社  | 2018/8/27  | 机器学习实战:基于Scikit-Learn和TensorFlow  | 被称为机器学习图书*强的存在!前谷歌工程师撰写,“美亚”人工智能图书畅销榜首图书!从实践...  | 
3  | 62.3  | 5  | 783  | 周志华 王魏 高尉 张利军  | 机械工业出版社  | 2020/5/30  | 机器学习理论导引  | |
4  | 39.6  | 4.5  | 1184  | 雷明  | 清华大学出版社  | 2019/9/1  | 机器学习――原理、算法与应用  | 全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度学习的原理与应用  | 
最后,将清洗完成的数据保存到 CSV 文件中。
data.to_csv("./input/books_cleaned.csv", index="None", sep="\t",encoding="utf8")7.总结
由于数据采集时获得的数据可能并不规范,不能直接用来分析,因此需要做数据清洗。本案例对爬虫抓取的书籍数据进行清洗,主要使用正则匹配和自定义的方法实现。首先提取了价格、评论以及星级的数值;然后对于出版信息中的数据分别获取书籍的作者、出版社和出版日期;最后基于原始数据的书名,进一步提取书的简介和名称,相较于前几步来说,提取书简介和书名可能相对复杂一些,当然在实际数据清洗时可能有多种方法,本案例仅提供其中一种方法供大家参考。











