作者|CDADataAnalyst选好菜品后,我们就可以开始切菜了。比如做凉拌黄瓜丝,找出黄瓜后,就可以把黄瓜切成丝。1.数值替换数值替换是将值A替换为B,可用于异常值替换处理和缺失值填充处理。主要有三种替换方式:一对一替换、多对一替换和多对多替换。1.一对一替换一对一替换是将某个区域中的所有一个值替换为另一个值。已知有一个年龄值为240。显然这是一个异常值。我们想把它换成一个正常范围内的年龄值(使用平均年龄33),如何实现呢?(1)Excel实现替换Excel中的某个值。首先,选择要替换的区域。如果只需要替换某列中的值,则只需要选中该列即可;如果要在某个区域进行替换,则拖动鼠标选择该区域。然后点击Edit菜单栏中的FindandSelect>Replace选项(如下图),弹出替换界面。使用快捷键Ctrl+H调出替换界面。下图是替换界面,分别输入搜索内容和替换内容,然后点击全部替换或者按要求替换。(2)Python实现了replace()方法来替换Python中的一个值。replace(A,B)表示用B替换A,上面的代码是替换年龄列,所以选择年龄列,然后调用replace()方法。有时需要替换整个表,比如替换整个表中的缺失值。此时replace()方法等同于fillna()方法。np.NaN是Python中缺失值的表示。2.多对一替换多对一替换就是用某个值替换一个区域内的多个值。已知有3个异常年龄(240、260、280),需要将这3个年龄替换为正常年龄。范围age的平均值是33,如何实现呢?(1)Excel实现在Excel中,需要使用if函数来实现多对一的替换。已知年龄列为D列,如果要替换多个异常值,可以使用如下函数。上面的公式在Excel中使用了OR()函数,意思是如果D列等于240、260或280,则该单元格的值为33,否则为D列的值。替换后的结果如图在下图中。(2)Python实现在Python中实现多对一替换比较简单,也是使用replace()方法,replace([A,B],C)表示用C替换A和B。3.多对多替换多对多替换实际上是在某个区域进行多个一对一的替换。例如将年龄异常值240替换为平均值减一,260替换为平均值,280替换为平均值加一。如何做到这一点?(1)Excel实现如果要在Excel中实现,需要用到函数,需要多个if嵌套语句来实现。年龄列也称为D列,具体功能如下:下图显示了该功能的执行过程。替换后的结果如下图所示。(2)Python实现如果想在Python中实现多对多的替换,也可以使用replace()方法,将替换值和要替换的值以字典的形式表示,replace({"A":"a","B":"b"}表示用a代替A,用b代替B。2.数值排序数值排序是按照具体值的大小进行排序,有两种升序和降序。升序是数值从小到大,降序是数值从大到小排列。1.按照一列数值排序按照一列数值排序是指整个数据表是按照某一列进行升序或降序排序的(1)Excel实现,在Excel中如果要按照某一列进行数值排序,只需选中该列的字段名,然后点击排序编辑菜单栏下的过滤按钮,选择升序或降序选项下拉式菜单。操作流程如下图所示。按salesID升序排序前后结果如下图所示。(2)Python实现如果我们想在Python中对某列进行排序,需要使用sort_values()方法,在sort_values()后的括号中指定要排序的列名,以及升序还是降序排列。上面代码表示df表按照col1列排序,ascending=False表示按照col1列降序排序。ascending参数默认值为True,表示升序排列。所以,如果要按照col1列升序排序,那么只需要指定列名即可,无需额外声明排序方式。2.根据有缺失值的列进行排序(一)Python实现在Python中,当待排序的列中有缺失值时,可以设置na_position参数来修正缺失值的显示位置值已设置。默认参数值为last,可以省略,表示缺失值显示在末尾。通过设置na_position参数,将缺失值显示在最前面。3.多列按值排序多列按值排序是指同时根据多列数据进行升序和降序排序。当第一列有重复值时,按第二列排序。当第二列有重复值时,按第三列排序,以此类推。(1)Excel在Excel中实现多列排序,选中所有需要排序的数据,点击编辑菜单栏下的排序筛选按钮,在下拉菜单中选择自定义排序选项,出现如图所示界面会出现下图。添加条件就是添加排序列。在顺序上,可以分别定义每一列的升序或降序。例如,将下图左侧的Before表按照salesID从小到大的顺序排列,遇到重复的salesID时再按照交易时间的降序排列,得到右侧的After表下图。(2)Python在Python中实现多列排序,使用的方法也是sort_values(),只要在其中以列表的形式指定要排序的多列的名称和每列的值即可sort-values排序依据后的括号。上面代码表示df表先按照col1列升序排序,col1列遇到重复时,再按照col2列降序排序。对于表df,我们还是先按salesid升序排列,遇到重复的salesid再按交易时间降序排列。代码如下。3.数值排名数值排名对应数值排名,将新增一列进行排名。该列用于存储数据的排名,排名从1开始。1.Excel实现Excel中用于排名的函数有两个:RANK.AVG()和RANK.EQ()。当待排序的值没有重复值时,这两个函数的效果是完全一样的。这两个函数的区别在于处理重复值的方式。RANK.AVG(number,ref,order)number表示要排序的值,ref表示一整列值的范围,order用于表示降序或升序。当待排序的值有重复值时,返回重复值的平均排名。销售ID的平均排名结果如下图所示。图中有两个salesID为1的值,假设一个rank为1,另一个rank为2,则两者的平均值为1.5,所以平均rank为1.5;还有两个salesID为2的值,同样假设一个rank为3,另一个rank为4,则两者的平均值为3.5,所以平均rank为3.5;销售ID为3的值没有重复值,因此排名为5。RANK.EQ(number,ref,order)RANK.EQ的参数值与RANK.AVG的含义相同。当要排序的值有重复项时,RANK.EQ返回重复项的最佳排名。销售ID的最佳排序结果如下图所示。图中有两个销售ID为1的值,第一个重复值的排名为1,所以两个值的最佳排名为1;还有两个值的销售ID为2,第一个重复值的排名为3,所以两个值的最佳排名为3;salesID为3的值没有重复值,最佳排名为5。2.Python实现值的排序在Python中,需要用到rank()方法。Rank()方法有两个主要参数,一个是ascending,用来表示升序还是降序,默认是升序,与Excel中顺序的含义一致;另一个是method,用于表示待排序的值有重复值时处理。下表是参数方法可以带的不同参数值和说明。该方法取平均值时的排名与Excel中的RANK.AVG函数一致。method的值为first时的排名情况,salesID为1的值有两个,第一个排在第1,第二个排在第2;销售ID为2,依此类推。method取值为min时的排名与Excel中RANK.EQ函数的排名一致。method取值为max时的排序情况与取值为min时的排序情况相反。销售ID为1的值有两个,第二个重复值的排名为2,所以两个值的排名都是2;salesID有两个值为2,第二个duplicate的rank为4,所以两个value的rank均为4。4.数值删除数值删除就是删除数据表中一些无用的数据。一、删除列(一)Excel中的实现在Excel中,要删除某一列或几列,只需选中这些列,然后单击鼠标右键,在弹出的菜单中选择删除选项(或单击鼠标右键(稍后按D键),如下图所示。(2)Python实现在Python中,删除一列,使用drop()方法,即在drop方法后的括号中指定要删除的列名或列的位置,即柱子。在drop方法后面的括号中,直接传入要删除的列的列名。需要添加一个参数axis,并且让它的参数值等于1,也就是删除列。也可以直接在drop方法后面的括号中传入要删除的列的位置,但是还需要用到axis参数。也可以将列名以列表的形式传递给column参数,此时不需要axis参数。2.删除行(1)Excel的实现在Excel中,删除某些行的方法与删除列的方法相同。先选中要删除的行,然后点击鼠标右键,在弹出的下拉菜单中选择删除选项即可删除该行。(2)Python实现在Python中,删除某些行的方法仍然是drop()。与删除列类似,删除行也表示与行相关的信息。在drop方法后面的括号中,直接传入要删除的行的行名,并将axis参数值设置为0,表示删除该行。除了传入行索引名外,还可以直接在drop方法后面的括号中传入要删除的行的行号,同时还需要使用axis参数,使其参数值等于0.也可以将要删除的行的行名传给index参数,此时不需要axis参数。3.删除特定行删除特定行一般是指删除满足一定条件的行。我们前面提到的异常值的删除被认为是删除了特定的行。(1)Excel实现了两步删除Excel中的特定行。第一步是筛选出符合条件的行。第二步,选中这些被过滤的行,点击鼠标右键,在弹出的下拉菜单中选择删除选项。(2)Python中删除特定行的方法有些特殊。我们不直接删除满足条件的值,而是将不满足条件的值过滤掉作为新的数据源,这样要删除的行就被过滤掉了。在下面的例子中,要删除age值大于等于40对应的行,我们不直接删除这部分,而是取出它的相反部分,即过滤掉age小于40的行为一个新的数据源。五、数值计数数值计数是统计某一数值在一系列数值中出现的次数。1.Excel实现在Excel中实现数值统计,我们使用COUNTIF()函数,该函数用于统计一个范围内满足给定条件的单元格的个数。range表示一系列值的范围,criteria表示某个值或某个条件。销售ID值的统计结果如下图所示。销售ID为1的值在范围F2:F6中出现了两次;销售ID为2的值也在此范围内出现两次;销售ID为3的值出现一次。2.Python实现在Python中,统计某个值出现的次数,我们使用的方法是value_counts()。上面代码的运行结果表明,销售ID为2的值出现了两次,销售ID为1的值出现了两次,销售ID为3的值出现了一次。这些是值出现的绝对次数。您还可以查看不同值出现的比例。你只需要将参数normalize=True传递给value_counts()方法。上述代码运行结果表明,销售ID为2的值所占比例为0.4,销售ID为1的值所占比例为0.4,销售ID为3的值所占比例为0.2。上面salesID的排序是2,1,3,按照计数值(0.4,0.4,0.2)降序排列。通过设置sort=False,可以实现不按计数值降序排列。6.获取唯一值获取唯一值是将一系列值去除重复的结果。通常,表中的列可以被视为一系列值。1、Excel是用Excel实现的。如果我们想查看某一列值中的唯一值,可以复制粘贴这一列值,然后删除重复的,剩下的就是唯一值。2.Python实现在Python中,我们想要获取一列值的唯一值。总体思路与Excel相同。首先复制粘贴某列的值,然后使用删除重复的方法来实现。关于删除重复项,参见前面提到的,本节使用另一种方法unique()获取唯一值。例如,为表df中的销售ID获取唯一值,首先提取销售ID,然后使用unique()方法获取唯一值,代码如下。7、数值查找数值查找是检查数据表中的数据是否包含某个值或某些值。1.Excel实现在Excel中,如果我们想查看某个值是否包含在数据表中,我们可以直接使用搜索功能。首先选择要搜索的区域,可以选择一列或多列。如果不勾选,默认会在整个表格中搜索。然后点击编辑菜单栏中的搜索选择按钮,在下拉菜单中选择搜索选项,如下图所示。下图为选择查找选项后弹出的查找替换对话框(也可以使用快捷键Ctrl+F打开查找替换对话框),在查找中输入要查找的内容即可what框,可以选择FindAll,这样会显示所有搜索到的内容;您也可以选择查找下一个,这样搜索结果会一一显示。2.Python实现isin()方法在Python中用于检查数据表中是否包含某个值,可以同时查找多个值,只需在isin()后面的括号中指定即可方法。可以取出一列数据,然后对该列调用isin()方法,查看该列是否包含某个/某个值,包含则返回True,否则返回False。还可以查找某个值是否包含在整个表中。8.区间分割区间分割就是把一系列的值分成几个部分。比如现在有10个人,你需要把他们按照年龄分成三组。这种分割过程称为区间分割。一、Excel实现在Excel中实现区间分割,我们使用if函数,具体公式如下:if函数的实现过程如下图所示。下图显示了使用if嵌套函数实现的结果。2.Python在Python中实现区间分割的cut()方法。cut()方法有一个参数bins来指定间隔。cut()方法的分割结果是几个左开右闭的区间,(0,3]表示大于0小于等于3,(3,6]表示大于3小于等于等于6,(6,10]表示大于6小于等于10。和cut()方法类似,还有qcut()方法,qcut()方法不需要指定分区interval,但是只需要指定partitions的个数,也就是你想把数据分割成多少份,然后它会根据要分割的数据的情况,把数据分割成预先指定的份数split,基于每组数据数量尽可能相等的原则,当数据分布比较均匀时,cut()方法和qcut()方法得到的区间基本一致。数据分布不均匀,即方差比较大的时候,得到的区间之间的偏差两者会比较大。9、在特定位置插入新的行或列插入行或列也是比较常见的操作。具体的插入操作有两个关键要素,一是插入哪里,二是插入什么。1、Excel实现在Excel中插入一行或一列,首先要确定要插入哪一行或哪一列,然后选中这一列或这一行点击鼠标右键,在弹出的下拉菜单中选择插入选项下菜单。要在唯一标识码列前插入一列,选中唯一标识码列,单击鼠标右键,在弹出的下拉菜单中选择插入选项,如下图。完成以上操作后,会出现一个新的空白行或列,在空白行或列中输入要插入的数据。是的。2.Python实现Python中没有专门的插入行的方法,可以把要插入的行当成一个新表,然后将两个表在纵轴方向拼接即可。关于表格拼接在后面的章节中会讲到。Python中用于插入新列的方法是insert(),insert方法后面的括号表示要插入的位置,插入后新列的列名,以及要插入的数据。也可以直接通过索引插入列,只需要让新列等于某个列值即可。上面的代码表示插入了一个名为commoditycategory的新列,该列的值为以下列表中的值。10.行列互换所谓行列互换(也称为转置),就是将行数据向列方向转换,将列数据向行方向转换。1、Excel在Excel中实现行列互换(转置),需要先将要转置的内容复制,然后粘贴到新的区域。粘贴选项选择转置,转置选项如下图所示。转置前后的效果对比如下图所示。2.Python实现在Python中,我们可以直接在源数据表的基础上调用.T方法来获取源数据表的转置结果。再次转置转置结果返回原始结果。转置表df,代码如下。再次转置转置后的表格,代码如下。11、索引重塑所谓索引重塑,就是对原来的索引进行重构。典型的DataFrame结构表如下表所示。上表是一个典型的DataFrame结构,使用行索引和列索引来确定唯一值,比如S1-C1的唯一值是1,S2-C3的唯一值是6。这种方法通过两个位置确定唯一值不仅可以用上面的表结构来表示,也可以用树结构来表示,如下图所示。树形结构其实就是在保持表类型行索引不变的前提下,将列索引变为行索引。其实就是为表类数据建立层次索引。将数据从表格数据转换为树数据的过程称为重塑。此操作在Excel中不可用。Python中使用的方法是stack()。示例代码如下。stack()方法对应的方法是unstack()方法。stack()方法将表格数据转换为树数据,unstack()方法将树数据转换为表格数据。示例代码如下所示。12.长宽表转换长宽表转换就是将比较长(行数多)的表转换成比较宽(列数多)的表,或者把比较宽的表转换成比较长的表。下表是一个宽表(有很多列)。我们想将这个宽表转换成一个长表,如下表所示。上面将多列转换为多行的过程就是将宽表转换为长表的过程。这个转换过程有一个前提条件,就是必须有公共列。1.宽表转长表宽表转长表。在Excel中,一般是通过复制粘贴来实现的。下面主要看看如何用Python实现。在Python中有两种方法可以实现这种转换,一种是stack()方法,另一种是melt()方法。(1)stack()方法实现了stack()将表格数据转化为树型数据时,将列索引变为行索引,同时保持行索引不变。这里,宽表转长表需要先将Sale2013、Sale2014、Sale2015、Sale2016改为行索引,Company和Name不变。因此需要先设置Company和Nmae为索引,然后调用stack()方法将列索引转换为行索引,最后使用reset_index()方法重新设置索引。示例代码如下。(2)melt()方法的实现使用melt()方法实现上述功能,代码如下。melt中的id_vars参数用于表示在宽表转长表时保持不变的列。var_name参数表示原列索引转换为“行索引”后对应的列名,value_name表示新索引对应的值的列名。.注意这里的“行索引”有双引号,不是实际的行索引,而是类似于实际的行索引。2.长表转宽表长表转宽表是宽表转长表的逆过程。常用的方法是数据透视表,具体实现如下:上面的实现过程是将Company和Name设置为行索引,Year为列索引,Sale为值。十三、apply()和applymap()函数我们在Python基础部分讲到Python的一个高级特性,map()函数。map()函数对序列中的所有元素执行相同的函数操作。DataFrame中有两个类似map()函数的函数,一个是apply()函数,一个是applymap()函数。函数apply()和applymap()都需要与匿名函数lambda结合使用。apply()函数主要用于对DataFrame中某一列或某行的元素进行同函数操作。applymap()函数用于对DataFrame中的每个元素执行相同的功能操作。
