第 3 章数据分析师岗位情况分析 ................................................................................................................ ———数据预处理 使命 ①了解在数据分析之前如何进行数据预处理 ; ②完成“数据分析师岗位 情况分析”案例的第二步——数据预处理 ; ③提升批判性地使用AI 工具的意 识 ; ④沉浸于“问题逻辑认知模式”中,通过5E 路径围绕解决问题开展 学习。 3.1  Excitation——提出问题 我们在第2章已经获取到450 条招聘数据分析师岗位的数据。在进行数据分析之前,首 先了解这个数据集。图3-1是用Exel打开数据集文件“ao_dt.s”后看到的部分内容。 clguaacv 图3- 1 数据集文件的文件头和前面部分数据 该数据集共有13 个字段,450 条数据,每个字段名称由英文标注。表3-1是字段的 含义。 表3- 1 数据集各字段含义 数据集字段名称含义 Column1 序号 positionName 职位名称 city 城市 district 区域 50 数据分析入门———思维、认知与创新 续表 数据集字段名称含义 salary 薪资 workYear 工作经验 education 学历要求 companyName 企业名称 industry 企业所属行业 financeStage 融资阶段 companySize 企业规模 companyLabelList 企业标签 positionAdvantage 福利待遇 通过浏览这些数据,我们发现爬取的这些数据还存在以下明显的问题。 (1)数据不完整(数据缺失)。如图32中缺少i、e、e、 companyLabelList等数据。 -ndustryfinanceStagcompanySiz 图3- 2 数据集中的数据不完整问题 (2)数据相同(数据重复)。如图3-3所示,序号第44 行和序号第47 行数据完全相同。 图3- 3 数据集中的数据重复问题 (3)存在与分析的问题无关的数据。如图3表中的C1和c 与分析的问题无关联。 -4, olumnompanyLabelList (4)数据取值异常。如图3-5,表中的Column1取值231 所在的这行数据,该行数据中 的salary薪资取值远大于其他薪资。 (5)目前的数据无法直接用于分析。例如,数据集中的“薪资”和“工作经验”字段的取 值是一个范围,不是一个具体的数值(见图3-5), 无法进行后续的相关分析,如工作经验与 第3章数据分析师岗位情况分析———数据预处理51 图3- 4 数据集中与后续分析无关的数据列 图3- 5 数据集中数据取值异常 职位需求、工作经验与薪资、薪资与学历、不同城市薪资待遇分析等。 可见,我们首先需要对这个数据集进行必要的处理才能进行后面的分析。 那么,在数据分析之前,如果数据集还存在问题,我们应该如何处理呢? 3.2  Exploration——探索问题本质 3.1 AI 助学 2. 如果我们遇到了上面的问题不知道如何下手,不妨借助AI 工具找到解决问题的方向。 问题: 在进行数据分析时,数据还存在数据不全、数据异常、数据重复、有的数据无法直接用于 分析等问题,应该如何处理? 文心一言回答: 在进行数据分析时,遇到数据不全、数据异常或某些数据无法进行分析的问题,需要采 取一系列的处理方法,以确保分析的有效性和准确性。以下是一些建议的步骤和方法。 (1)数据清洗。 ● 处理缺失值。根据缺失值的类型和分布情况,可以选择删除含有缺失值的记录、使用 均值、中位数、众数或其他统计方法进行填充,或者使用插值、预测等方法进行估算。 ● 处理异常值。异常值可能是数据输入错误、测量误差或其他原因导致的。可以通过 统计分析、绘制箱线图、使用3σ 原则等方法识别异常值,并根据具体情况选择删除、 替换或保留这些值。 (2)数据转换。 ● 对于不符合分析要求的数据,如格式不正确、单位不统一等,需要进行数据转换。例 如,将文本格式的数字转换为数字格式,将不同单位的数据转换为统一单位等。 ● 对于非线性关系的数据,可以考虑进行对数转换、Box-Cox转换等,以改善数据的分 布和线性关系。 (3)数据插补。 52 数据分析入门———思维、认知与创新 对于缺失值,除了上述的填充方法外,还可以使用插补技术,如 K 近邻插补、多重插补 等,以更精确地估算缺失值。 (4)数据降维。 对于高维数据,可以考虑使用主成分分析(PCA )、因子分析等方法进行降维,以减少计 算量并提高分析的准确性。 (5)数据合并与整合。 如果数据来源多个渠道或表格,需要进行数据合并与整合。在合并数据时,需要注意数 据的一致性和完整性,避免重复和遗漏。 (6)数据筛选。 根据分析目的和需要,对数据进行筛选,选择相关的变量和记录进行分析。同时,要注 意去除无关紧要的变量和记录,以提高分析的效率和准确性。 (7)使用适当的统计方法或模型。 根据数据的类型和分布特点,选择合适的统计方法或模型进行分析。例如,对于连续变 量可以使用 t 检验、方差分析等方法;对于分类变量可以使用卡方检验、逻辑回归等方法。 (8)结果验证与解释。 对分析结果进行验证和解释,确保结果的可靠性和准确性。如果结果不符合预期或存 在疑问,需要重新检查数据处理和分析过程,找出问题所在并进行修正。 总之,在进行数据分析时,遇到数据不全、数据异常或某些数据无法进行分析的问题时,需要 采取一系列的处理方法和技术手段,以确保数据的质量和准确性,从而得到可靠的分析结果。 从AI 工具的回答中可以看到,在进行数据分析之前,可能需要对数据进行一系列处 理。同时,AI 工具给出的(7)和(8)与所提的问题无关,应该是数据分析的方法和结果验证 的内容,将其忽略即可。 3.2.2 探索问题本质———找准靶心 在进行数据分析之前,一般需要对将要分析的数据进行处理,这个过程称为数据预处 理。在3.1节中,我们浏览数据发现的问题包括数据缺失、数据重复、数据异常、存在与分析 无关的字段以及数据无法直接用于分析等。基于AI 的帮助,我们将要进行的数据预处理 任务分为以下三个子任务。 (1)数据清洗 。 发现并处理数据集中存在的缺失值、重复值和异常值 。 (2)特征选择。 从数据集中选择对分析目标有用的字段(特征), 从而提高处理的效率,增强分析结果可 解释性。例如,数据中的“Column1”和“companyLabelList等(”) 字段与我们的分析目标无关, 可以直接去除。 (3)数据转换。 将原始不能直接用于分析的数据进行转换,使其满足数据分析的需求。例如,我们数据 中的薪资和工作经验字段等需要转换成数值。 第3章数据分析师岗位情况分析———数据预处理53 3.3 Enhancement——拓展求解问题必备的知识和能力 3.选择数据预处理工具 3.1 明确了数据预处理要完成的具体任务后,接下来是如何进行数据预处理。首先,我们想 到的就是使用工具。常见的数据预处理工具有哪些呢? 这里,我们可借助AI 工具了解。 问题: 常见的数据预处理工具有哪些? 文心一言回答: 常用的数据预处理工具包括以下几类。 (1)编程语言库。 ●Pandas。Python中的一个强大的数据分析工具,提供了数据结构和数据处理功能, 如Series、DataFrame 等,方便进行数据清洗和转换。 ●NumPy。Python中用于处理数组和矩阵运算的库,提供了数学函数和线性代数运算 功能,可用于数据的数值变换。 ●SciPy。Python中用于科学计算的库,提供了矩阵支持、数值计算模块等功能,可用于 数据处理和分析。 ●R语言。R是统计分析领域的常用语言,拥有大量的数据处理和分析包,如 tidyverse、dplyr等,方便进行数据清洗和转换。 (2)数据清洗工具。 ●OpenRefine(原名GoogleRefine)。一个开源的数据清洗工具,通过可视化界面和交 互式工具帮助识别、清理和转换数据集中的错误、重复或不完整的数据。 ●TrifactaWrangler。一个自动化的数据清洗工具,提供了数据探查、数据清洗和数据 准备等功能,帮助用户快速清洗和整理数据 。 (3)ETL 工具 。 ●Talend。一个数据集成和数据质量工具,提供了数据清洗、数据转换和数据匹配等功 能,确保数据的一致性和准确性。 ●ApacheNifi。一个易于使用、功能强大的数据流工具,可以帮助设计、构建和管理实 ( 时数据流,包括数据清洗和转换等任务。 4)数据可视化工具。 ●Tableau。一款强大的数据可视化工具,提供了丰富的图表类型和交互功能,帮助用 户更好地理解和分析数据。 ●PowerBI 。微软推出的商业智能工具,提供了数据预处理、数据可视化和数据分析等 功能,方便用户进行数据探索和分析。 这些工具各有特点和优势,可以根据具体的数据情况和需求选择合适的工具进行数据 预处理。同时,也可以结合多种工具的功能进行组合使用,以满足复杂的数据处理需求。 在AI 的帮助下,我们知道了Python的Pandas是一个强大的数据分析工具,方便进行 54 数据分析入门———思维、认知与创新 数据清洗和转换。因此决定使用Pandas作为数据预处理工具,完成数据清洗、特征选择和 数据转换等任务。 提示:Pandas是Python中专门用于数据处理和数据分析的第三方库,需要单独下载 并安装。 3.2 Pnas基础 3.ad 使用Pandas进行数据预处理之前,需要先学习关于数据与Pandas的一些相关概念和 基础知识。 3.2.数据的相关概念 3.1 1. 数据元素 数据元素,也称为结点或记录。一个数据元素可由若干数据项(属性、字段)组成。例 如,表3-2所示的考生数据,每名考生的数据就是一个数据元素,包括准考证号、姓名和语 文、数学、英语、历史、地理、政治6门课程的成绩。 2. 一维数据 一维数据是指数据元素由一个因素即可确定。例如,一名考生的数据就是一维数据,如 表3-2所示。表中的阴影部分就是一维数据,它的某个数据项由该数据项所在位置这一个 因素便可确定。例如,姓名“张珊”这个数据项仅由它所在的位置2即可确定。 表3- 2 一维数据示例 含义准考证号姓名语文数学英语历史地理政治 位置1 2 3 4 5 6 7 8 数据KS00001 张珊109 120 114 78 82 90 3. 二维数据 二维数据由多个一维数据组成,二维数据中的某项数据需要由两个因素共同决定。例 如,多名考生的数据就是一个二维数据,如表3-3所示。表中的阴影部分就是一个二维数 据,它的某一个数据项需要由该数据项所在的行和列两个因素才能确定。例如,李思的数学 成绩116 这个数据项,需要由该数据项所在的行号2和所在的列号4两个因素共同确定。 表3- 3 二维数据示例 含义准考证号姓名语文数学英语历史地理政治 行号 列号 1 2 3 4 5 6 7 8 1 KS00001 张珊109 120 114 78 82 90 2 KS00002 李思123 116 137 84 92 94 3 KS00003 王武133 129 132 83 85 78 第3章 数据分析师岗位情况分析———数据预处理 55 3.3.2.2 Pandas的数据结构 Pandas提供了Series和DataFrame两种数据结构,分别用于处理一维数据和二维数 据。这两种数据结构能够满足处理金融、统计、社会科学、工程等领域里绝大部分问题的 需求。 1.Series Series是一组有索引标签且数据类型相同的一维数据结构。Series对象包括两个部 分:①values,一组数据;②index,相关数据的索引标签。 【例3-1】 基于列表数据创建一个Series对象。 1 #加载Pandas 库 2 import pandas as pd #pd 是pandas 的别名 3 #由列表创建Series 对象 4 names=["张珊","李思","王武","李明","徐晓丽"] #定义一个名为names 的列表 5 print("原始列表为:") 6 print(names) 7 Snames=pd.Series(names) #由names 列表创建一个Series 对象 8 print("由列表创建的Series 为:") 9 print(Snames) 在上述代码中,第2行使用import将pandas加载到程序中,并使用as给pandas起了 一个别名pd(也可以是其他名称)。这样,程序中用到pandas的地方就可以换成pd,从而简 化程序的书写过程。第7行使用pd.Series()方法创建了一个Series对象,该对象中保存的 数据来自列表names中存储的5个姓名字符串。 程序的运行结果如图3-6所示。names列表只包含5个字符串,而由列表创建的Series 除了包含原始列表中的数据值外,还包含标签(索引)信息。 图3-6 例3-1的程序运行结果 2.DataFrame DataFrame是具有行标签和列标签的二维表格型数据结构,与Excel表类似,每列数据 可以是不同的值类型(数字、字符串、布尔型等)。图3-7是DataFrame结构示意图。 DataFrame是一个抽象的类,要使用DataFrame中的方法,就需要创建一个具体的 DataFrame对象。创建DataFrame对象的语法如下: pandas.DataFrame(data, index, columns, …) 56 数据分析入门———思维、认知与创新 图3-7 DataFrame结构示意图 其中,主要参数的含义: ① data,是所创建的DataFrame对象中数据的来源,可以是列表、字典、Series或 DataFrame对象等。 ②index,是DataFrame对象数据的行标签,如果未指定,则默认为RangeIndex,即(0, 1,2,…,n-1),n 为行数。 ③columns,是列标签,如果未指定则默认为RangeIndex,即(0,1,2,…,m -1),m 为 列数。 【例3-2】 基于列表数据创建一个DataFrame对象。 1 import pandas as pd #pd 是pandas 的别名 23 employees=[ 4 ['1001','张伟','男','财务部','1999-7-1'], 5 ['1002','李晓欣','女','审计部','2007-4-5'], 6 ['1003','邓朝阳','男','销售部','2004-2-28'] 7 ] 8 #创建DataFrame 对象df 9 df = pd.DataFrame(employees,columns=['员工编号','姓名','性别', '部门', '入职 日期']) 10 #输出DataFrame 对象df 11 df 程序的运行结果如图3-8所示。 图3-8 例3-2的程序运行结果 在图3-8中,最左侧的0、1、2是默认的行标题(标签);最上面的员工编号、姓名、性别、 部门、入职日期则是创建对象时设置的列标题(标签)。 提示:由于实际应用场景中处理的大多都是二维数据,因此下面重点介绍DataFrame 第3章 数据分析师岗位情况分析———数据预处理 57 结构的相关方法。 3.3.2.3 Pandas读写文件 Pandas提供了读取Excel和CSV 文件数据的方法,返回值为DataFrame对象;还提供 了将DataFrame数据保存到Excel和CSV 文件中的方法。下面仅介绍Pandas读写CSV 文件的相关方法。读写Excel文件的方法与CSV 类似,读者可自行查阅相关资料。 1.写文件 DataFrame的to_csv()方法可以将DataFrame对象的数据写入CSV 文件。该方法可 以设置很多参数,除了必须给出写入文件的路径和名称外,其他参数都可以缺省。例如,可 以通过columns参数指定写入的列标题;通过index参数指定是否写入行标签,默认为 True,表示写入行标签;通过encoding参数指定文件使用的字符集编码类型,常见的编码格 式包括UTF-8、GBK、GB2312等。此处不再一一展开,想深入了解的读者可自行查阅相关 资料。 【例3-3】 使用Pandas将例3-2中DataFrame对象df中保存的3条员工数据写入名 为“员工数据.csv”文件中。 使用Pandas的to_csv()方法非常简单,只需在例3-2的代码最后添加如下的一行代码 即可。 df.to_csv('d:/project/员工数据.csv') 其中,“d:/project/”表示写入的文件路径,“员工数据.csv”表示要写入数据的文件名。 程序运行完毕,会在所设置的路径下生成该文件。可以使用记事本、Excel等软件打开查看 该文件。 提示:写入文件时,写入的文件路径须真实存在,否则会报找不到文件“FileNotFoundError” 的错误。 2.读文件 Pandas的read_csv()方法用于读取csv格式的文件,并将存储文件数据的DataFrame 对象返回。该方法也可以设置很多参数,除了必须设置读取的文件路径和名称外,其他参数 都可以缺省。例如,可以通过header参数指定第几行作为列名,默认为0,表示第一行;通过 sep参数设置所读取文件的分隔符,默认用逗号分隔;encoding参数指定文件中字符集使用 的编码类型等。 【例3-4】 使用read_csv()方法读取图3-9所示的“华为Mate60销售情况.csv”示例文 件。该文件共4个字段,有12条数据,每个字段分别为产品名称、店铺名称、地理位置和产 品价格。假设该文件存储在“d:/project”目录下。 程序代码如下: 1 import pandas as pd 2 df = pd.read_csv('d:/project/华为Mate60 销售情况.csv') 3 #输出DataFrame 4 df 5 8 数据分析入门———思维、认知与创新 图3华为Ma60 销售情况.v文件的内容示意图 -9tecs 在上述代码中: 第2行使用read_csv() 方法读取CSV 文件的数据,并将数据存储在DataFrame 对象df 中,v() 方法只给出了第一个参数,代表读取的文件路径和文件名称。 readcs第4(_) 行是将返回的df对象输出到屏幕上。程序的运行结果如图3-10 所示 。 图3-10 例3-4的程序运行结果 提示:读取文件时,如果遇到编码错误的问题,可以设置read_csv() 方法的encoding参 数,尝试设置为常见编码UTF-8、GBK 或GB2312 等。 3.3.2.ads查看数据 4 Pna ame 查看数据的方法主要包括 : DataFrn) 用于获取前 n 条数据,缺省时默认为5 。 (1)head(方法, n 为整数值, (2)tail(方法, n 为整数值,缺省时默认为5。 n) 用于获取后 n 条数据, (3)info() 方法,用于查看数据的概要信息,包括列数、列标签、列数据类型、每列非空值 第3章 数据分析师岗位情况分析———数据预处理 59 数量、内存使用情况等。 (4)describe()方法,用于查看数值型数据的数量、均值、最大值、最小值,方差等信息。 【例3-5】 使用info()方法和describe()方法查看DataFrame对象数据的情况。 1 #导入Pandas 库 2 import pandas as pd 3 df = pd.read_csv('d:/project/华为Mate60 销售情况.csv') 4 df.info() 5 df.describe() 在上述代码中: 第4行输出的是DataFrame对象df的概要信息,包括数据条数、数据列、各列的列名、 每列非空值的数量、每列的数据类型和占用的内存空间等。 第5行输出的是DataFrame对象df中数值型数据(产品价格)的统计值,包括数量、均 值、标准差、最小值、下四分位数、中位数、上四分位数和最大值。程序的运行结果如图3-11 所示。 图3-11 例3-5程序的运行结果 3.3.3 用Pandas进行数据清洗 3.3.3.1 缺失值检测与处理 缺失值主要包括空值、表示数值缺失的特殊数值(如NaN、Na、NaT等)和空字符串等。 Pandas提供了一系列的方法用来处理缺失数据,主要包括检测缺失值、删除缺失值和 填充缺失值。 60 数据分析入门———思维、认知与创新 1.数据缺失的检测 (1)空值和NaN 类缺失值的检测。 Pandas检测空值或NaN 类的缺失值时,既可以使用isnull()方法,也可以使用isna() 方法。这两种方法均可以检测DataFrame或Series中的缺失值。两种方法返回的是相应 位置上的布尔型值,True表示缺失,False表示不缺失。 另外,检测时还可以搭配相应统计方法查看数据缺失情况,如搭配sum()方法可以统计 缺失值的数量。 【例3-6】 检测“华为Mate60销售情况.csv”文件中数据是否有空值或缺失值。 1 import pandas as pd 2 df = pd.read_csv('d:/project/华为Mate60 销售情况.csv') 3 #检测是否有缺失值 4 missing_values = df.isnull() 5 print("缺失值检测:\n", missing_values) 6 #统计每列缺失值的数量 7 missing_count = df.isnull().sum() 8 print("\n 每列缺失值数量:\n", missing_count) 9 #统计每行缺失值数量 10 missing_count_per_row = df.isnull().sum(axis=1) 11 print("\n 每行缺失值数量:\n", missing_count_per_row) 程序的运行结果如图3-12所示。 图3-12 例3-6程序的运行情况 第3章 数据分析师岗位情况分析———数据预处理 61 由图3-12可知,地理位置列数据中存在一个缺失值,位置在第3行;产品价格列数据中 也存在一个缺失值,位置在第11行。 (2)空字符串检测。 isnull()方法和isna()方法不适用于检测空字符串,字符串的检测需要用到比较运 算符。 【例3-7】 检测DataFrame对象是否有空字符串。 1 import pandas as pd 2 #创建一个DataFrame 对象df 3 df=pd.DataFrame({'A':[1, 2, ''],'B':[4,'',6]}) 4 print('-------------------') 5 print(df) 6 #使用isnull()方法检测空字符串 7 print('-------------------') 8 print(df.isnull()) 9 print('-------------------') 10 #使用比较运算符检测空字符串 11 print(df=="") 图3-13 例3-7程序 的运行结果 程序的运行结果如图3-13所示。 由图3-13可知,isnull()方法并不适用于检测空字符串。 2.删除缺失值 如果某个特征(字段)缺失值比例较高,且这些缺失值对分析目标 没有实质性影响,则可以考虑删除缺失值。Pandas提供的dropna()方 法可以删除用isnull()方法或isna()方法检测出的缺失值,其语法格 式如下: Pandas.DataFrame.dropna(axis=0, how,*) 其中,主要参数的含义: ①axis,用来设置删除的是行还是列,取值为0删除行,取值为1 表示删除列,默认值为0。 ② how,设置删除数据的规则。取值为“all”,表示所有数据均为空时才删除,取值为 “any”,表示只要有一个为空就删除,默认取值为“any”。 【例3-8】 删除“华为Mate60销售情况.csv”数据中所有包含缺失值的行。 1 import pandas as pd 2 df = pd.read_csv('d:/project/华为Mate60 销售情况.csv') 3 #删除所有包含缺失值的行 4 df.dropna() 程序的运行结果如图3-14所示。 由运行结果可知,dropna()方法删除掉了包含缺失值的第3行和第11行数据。 提示:这种方法并不能删除包含空字符串的数据。 62 数据分析入门———思维、认知与创新 图3-14 例3-8程序的运行结果 3.填充缺失值 当缺失值的比例相对较低时,可以选择填充缺失值,这样有助于保留数据的完整性,避 免因为删除少量数据而损失信息。Pandas提供的fillna()方法可以填充用isnull()或isna()方 法检测出来的缺失值,其语法格式如下: Pandas.DataFrame.fillna(value=None, method=None, axis=None,*) 其中,主要参数的含义: ① value,用于填充缺失值的标量值或字典等。 ② method,用于设置填充方式。取值为“bfill”表示向后填充,即用缺失值之后的第一 个有效值进行填充;取值为“ffill”表示向前填充,即用缺失值之前的第一个有效值进行 填充。该 方法返回填充缺失值后的DataFrame对象。 对于数值缺失值,可以使用固定值、均值、中位数、插值等进行填充;对于分类特征(即该 字段所在列取值为字符串而非数值),可以使用众数、特殊值等进行填充。 众数(Mode)是指在统计分布上具有明显集中趋势点的数值,代表数据的一般水平。也 是一组数据中出现次数最多的数值,有时一组数中会有多个众数。 【例3-9】 填充“华为Mate60销售情况.csv”中的缺失值。 1 import pandas as pd 2 df = pd.read_csv('d:/project/华为Mate60 销售情况.csv') 3 #1.使用众数填充分类字段(特征) 4 #获取'地理位置'列的众数 5 mode_value = df['地理位置'].mode()[0] 6 #使用众数填充'地理位置'列中的缺失值,inplace 为True 表示原地修改 7 df['地理位置'].fillna(mode_value, inplace=True) 第3章 数据分析师岗位情况分析———数据预处理 63 8 #2.使用均值填充产品价格 9 #获取产品价格列的均值 10 mean = df['产品价格'].mean() 11 df['产品价格'].fillna(mean,inplace=True) 12 print(df) 在上述代码中: 第5行mode()方法用于获取某列的所有众数,“[0]”用于获取所有众数中频率最高的 那个。第 7行使用fillna(mode_value,inplace=True)方法使用地理位置列的众数填充缺失 值,inplace=True代表修改原来的df。 第10行mean()方法用于获取某列的均值。 第11行使用产品价格列的均值填充缺失值,并且修改原来的df。 程序的运行结果如图3-15所示。第3条数据易购通信缺失的“地理位置”,使用了地理 位置列出现次数最多的“北京”进行填充;第11条数据缺失的“产品价格”,使用了产品价格 列的均值进行填充。 图3-15 填充缺失值后的数据 3.3.3.2 重复值检测与处理 Pandas对重复值的处理主要包括检测重复值和删除重复值。 1.检测重复值 Pandas提供的duplicated()方法可以检测DataFrame中的重复数据,其具体语法如下: duplicated(subset=None, keep='first',*) 其中,主要参数的含义: ①subset,指定要检查的列标签列表,缺省则检查所有列。 ② keep,指定如何标记重复值,默认为“first”,不同取值含义:“first”表示将第一个值 视为唯一值,将其余相同的值视为重复值;“last”表示将最后一个值视为唯一值,将其余相 64 数据分析入门———思维、认知与创新 同的值视为重复值;False表示将所有相同的值均视为重复项。 该方法返回值为布尔型的Series结构,True表示重复,False表示不重复。 另外,检测重复值时,还可以搭配sum()方法统计重复数据的数量。 【例3-10】 使用duplicated()方法查找重复数据。 1 import pandas as pd 2 df = pd.read_csv('d:/project/华为Mate60 销售情况.csv') 34 #检测重复值 5 duplicate_values = df.duplicated() 6 print("重复值检测:\n", duplicate_values) 78 #统计重复值数量 9 duplicate_count = df.duplicated().sum() 10 print("\n 重复值数量:", duplicate_count) 图3-16 例3-10程序 的运行结果 在上述的代码中: 第5行代码使用duplicated()方法将产品名称、店铺名称、地理 位置和产品价格完全相同的记录标记为True。 第9行代码统计重复数据的数量。 程序运行的结果如图3-16所示。 2.删除重复值 Pandas提供的drop_duplicates()方法可以删除重复数据,其具 体语法如下: DataFrame.drop_duplicates(subset=None,keep='first', inplace=False,…) 其中,sunset和keep 参数的含义与duplicated()方法一致。 inplace参数代表是否原地修改,默认是False,表示不改变原 DataFrame;True则表示在原DataFrame中删除重复数据。该方法 返回的是删除重复值后的DataFrame。 【例3-11】 使用drop_duplicates()删除重复数据。 1 import pandas as pd 2 df = pd.read_csv('d:/project/华为Mate60 销售情况.csv') 3 df_new = df.drop_duplicates() 4 df_new 程序运行结果如图3-17所示。 以上是处理缺失值和重复值的基本方法。实际场景中,我们根据具体业务的需求,选择 适合的处理方式。例如,删除重复值时,可以根据具体需求,选择保留第一个出现的值或最 后一个出现的值等。 第3章数据分析师岗位情况分析———数据预处理65 图3-17 例3-11 程序的运行结果 3.3.异常值的检测与处理 3.3 异常值(outlier)又称离群点,是指数据中与大多数其他数据明显不同的值。 Pandas提供了一系列的方法用来处理异常数据,主要包括检测异常值、删除异常值和 替换异常值。 1. 检测异常值 常见的判定数据中是否存在异常值的方法包括3σ 原则和箱线图(箱形图)。 (1)3σ 原则。 计算数据的均值和标准差,然后根据3σ 原则,将位于均值±3 倍标准差之外的数据视 为异常值。 使用3σ 原则判断数据集中是否存在异常数据的前提是数据满足正态分布,若数据非正 态分布,则可使用箱线图判断异常数据。 如3.3.2.Pnaecie() 标准差、 4节所述,ads提供的dsrb方法可以计算数据的均值、上四分 位数、中位数、下四分位数等,因此,借助describe() 方法,进行简单计算便可以判定数据集 中是否存在异常数据。 (2)箱线图。 箱线图是一种用作显示一组数据分散情况的统计图,由上限、上四分位数、中位数、下四 分位数、下限组成。它最大的优点就是不受异常值的影响,以一种相对稳定的方式描述数据 的离散分布情况。通过箱线图,可以直观地发现数据中是否存在异常。 图3-18 是一个箱线图。根据数据的上四分位数Q3(分布在75% 的位置)和下四分位数 Q1(分布在25% 的位置)和四分位距(IQR=Q3-Q1), 将位于下限(Q1-5IQR)和上限 (Q3+1.之外的数据视为异常值。 1. 5IQR) 为了更直观地查看数据集中的异常数据,可以借助Pandas提供的boxplot() 方法绘制 66 数据分析入门———思维、认知与创新 图3-18 箱线图 箱线图,具体语法如下: DataFrame.boxplot(column=None,*) 其中,参数column 用于指定绘制箱线图的数据列。如果不指定,则默认绘制 DataFrame中所有数值列的箱线图。 DataFrame支持按照条件对DataFrame中的数据进行筛选。其具体语法如下: df[筛选条件] 其中,筛选条件的常见形式为:df[‘标签’]满足某个条件,如df[‘标签’]等于某个值, 大于某个值或小于某个值等,筛选条件返回一个布尔型Series,通过df[布尔型Series]把 DataFrame中对应标签,布尔值为True的数据筛选出来,得到的是DataFrame对象。 筛选条件既可以是单个条件,也可以是多个条件,多个条件之间使用Pandas的逻辑运 算符与(&)、或(|)、非(~)连接。需要注意的是,每个筛选条件需要用小括号括起来。 【例3-12】 使用箱线图法判断”新-华为Mate50销售情况.csv”文件(如图3-19所示)中 是否存在异常数据。与华为Mate60文件结构相同,该文件也有4个字段,共9条数据,每 个字段分别为产品名称、店铺名称、地理位置和产品价格。同样,假设该文件存储在 “d:/project”目录下。 图3-19 华为Mate50销售情况 第3章 数据分析师岗位情况分析———数据预处理 67 1 import pandas as pd 2 df = pd.read_csv('d:/project/新-华为Mate50 销售情况.csv') 3 #绘制箱线图 4 df.boxplot(column='产品价格') 5 #使用describe 方法查看产品价格数据列统计信息 6 stat_data = df['产品价格'].describe() 7 #从统计信息stat_data 中获取上四分位数和下四分位数 8 Q3 = stat_data.loc['75%'] 9 Q1 = stat_data.loc['25%'] 10 #计算四分位距 11 IQR = Q3-Q1 12 #计算下限、上限 13 lower_limit = Q1 -1.5*IQR 14 upper_limit = Q3 + 1.5*IQR 15 #筛选数据 16 cond = (df['产品价格']upper_limit) 17 #筛选数据 18 df_new = df[cond] 19 df_new 在上面的代码中: 第16行代码定义了在DataFrame中筛选数据的条件。 第18行代码筛选出了满足条件的数据。 提示:程序运行时,首先显示第19行的df_new,然后才显示第4行绘制的箱线图。在 不同的平台上运行以上代码需考虑字体库,用以显示中文。 程序运行结果如图3-20所示。 图3-20 例3-12程序的运行结果 由图3-20可知,华为Mate50产品价格均匀分布在1500~4500元。数据中存在两个异 常产品价格,即9999.0和11930.0,需要进行适当处理。 2.删除异常值 如果异常数据在数据集中所占比例很小,可以直接删除异常数据。 68 数据分析入门———思维、认知与创新 删除异常数据有两种方式:一种是对异常数据筛选条件取反,筛选得到的就是不包含 异常数据的数据集;另一种方式是通过drop()方法删除指定索引的数据。下面介绍第一种 删除异常的方式。 【例3-13】 删除新-华为Mate50销售情况表中的异常数据。 在例3-12下方添加如下两行代码,即可获取到不包含异常值的数据。 1 df_new_1 = df[~cond] 2 df_new_1 程序运行结果如图3-21所示。 图3-21 例3-13程序的运行结果 3.替换异常值 还可以根据需要将异常值替换成特定值,如替换为中位数、均值等,当然也可以通过插 值法根据相邻数据点的值推测并替换异常值。 Pandas提供的replace()方法可以实现数据替换,具体语法如下: DataFrame.replace(to_replace=None, value= _NoDefault.no_default, *, inplace= False,*) 其中,主要参数的含义: ①to_replace,表示需要被替换的旧值,它可以是一个单一的值,也可以是一个列表或 字典,表示多个值要被替换。 ② value,表示用于替换的新值,它可以是一个单一的值,也可以是一个列表或字典,表 示某些旧值需要被替换为不同的新值。 ③inplace,表示是否直接替换原来的数据,默认值为False。 【例3-14】 使用replace()方法替换新-华为Mate50销售数据表中的异常数据。 1 import pandas as pd 2 df = pd.read_csv('新-华为Mate50 销售情况.csv') 3 #产品价格的均值 4 mean = df['产品价格'].mean() 5 #产品价格中位数 6 median = df['产品价格'].median() 7 #一对一替换