引言:在用python处理数据时,我们通常会遇到数据不完整的情况,比如有空值的时候,我们想要删除控制所在的行或列,或者是我们给空值设置为某一个值。这时候就可以用dropna和fillna两个函数来实现空值的处理。

目录

(一)、dropna()函数的用法。

(二)、fillna()函数的用法


(一)、dropna()函数的用法。

dropna(axis,how,thresh,subset,inplace)

参数说明:

axis:这个参数默认为0,当等于0时代表的是删除空值nan所在的行,当等于1时删除空值所在的列。

how:这个参数的值默认为‘any’,表示的是删除空值所在的行或者是列,这个主要看前面的axis参数你设定是0还是1;当参数等于‘all’,表示的是删除一阵行或者是一整列都为空值nan的行或者列,如果你的某一行或某一列,不全为空值的话,则不会删除,即不起作用。

thresh:这个参数是一个整数x,意思是保留空值nan的数量小于x的每一行或者是每一列。比如我设置x=2,那么我每一行或者是每一列的非空值的数量大于等于2的行或者列都会被保存,具体是行还是列,那还是看前面的axis参数的设置。

subset:这个参数的意思是指定删除特定行或列的空值所在的列或行,如果axis=0,表示如果指定行x中有空值,则删除所在的列;如果axis=1,表示如果指定列x有空值,则删除空值所在的行。

inplace:这个参数默认为False,它的意思是你在处理空值nan时,是在原数据上处理还是在先把原数据复制一份,然后在副本上处理,在副本上处理的时候,原数据不受任何影响;如果inplace设置为True,那代表你在原数据上进行处理,原数据直接受影响。

讲完参数的概念,我们来看一个例子来看一下这些参数对函数的影响和作用。

示例:

先创建一个3X4的矩阵,然后在指定的位置设置一些空值,然后对包含空值的数据进行处理。

import numpy as np
import  pandas as pd
dataSet = pd.DataFrame(np.arange(12).reshape(4,3),index=[0,1,2,3],columns=['a','b','c'])
dataSet.iloc[1,[1]] = np.nan
dataSet.iloc[2,[1,2]] = np.nan
print(dataSet)

创建的数据如下图所示:

行标识是0,1,2,3;列标识是a,b,c,这是我自己命名的,不算矩阵数据哈。

 注意:我们这里声明参数的时候,没有声明的则都是默认的参数,声明的则都是把默认参数改为我们想要的参数,发挥的作用是不同的,没有声明的话,则看前面我对各个参数的解释。接下来看一下参数不同时,结果的差异。

调用函数dataSet.deropna(),所有的参数都为默认值,那么会删除空值所在的第一行和第二行的数据。我们来看以下结果。我直接把代码和结果截图在一起了。

 调用函数dataSet.dropna(axis=1),其他参数默认,删除空值nan所在的列。如下图所示。

 调用函数dataSet.dropna(axis=1,how='all'),我们会删除整列都是空值的=列,但是我们的数据中,没有一列都为空值nan的列,所以,结果还是原数据的结果,没有改变。结果如图所示。

 调用函数dataSet.dropna(axis=1,thresh=3),意思是我每一列的非空的值的数量只要大于等于3我就保留,否则删除这一列。因为原数据中,b这一列的非空值的数量为2,并不大于3,所以要删除b这一列。结果如下图所示。

 调用函数dataSet.dropna(axis=1,subset=[‘b’]),如果axis=0,表示如果指定行x中有空值,则删除所在的列;如果axis=1,表示如果指定列x有空值,则删除空值所在的行。所以我调用的这个语句的意思是,我要指定b这一列如果有空值的话我就删除空值所在的行,如果没有空值,那就不做操作。结果如下图所示。

 调用函数dataSet.dropna(inplace=True),参数为True时,表明我是在原数据上操作的,没有原数据的副本,我们上面调用的那些函数的参数inplace都是默认值False,我们在调用上面那些函数之后,可以打印输出一下dataSet这个原数据,他并没用改变。如果我这里是True的话,则原数据也改变了。如下图所示。可以看出原数据也改变了。

 总结:上面就是关于dropna函数的用法,大家可以通过改变不同的参数实践一下,看一下效果,动手实践会让自己更加印象深刻哦。

(二)、fillna()函数的用法

fillna(axis,mthod,limit,inplace)

看起来是不是和dropna函数的参数长的非常像。inplace的含义和dropna函数中的参数含义一样,这里不再解释。

axis:这个参数取1时,表示按照行来填充,取0时表示按照列来填充。默认为0,即按照列。和dropna函数的刚好相反。

method:这个参数的意思是填充的方式,如果为‘ffill’,则是将这个空值的前一个数据复制给这个空值;如果为‘bfill’,则是将这个空值的后一个数据复制给这个空值。如果不用这个参数,不声明即可。

limit:这个参数时限制填充的空值的个数,比如某一列有两个空值,我这里指定只填充一个空值,另一个空值不管它。

示例:我们还以之前的那个数据为例,创建数据矩阵。如下图所示,需要引入头文件numpy和pandas,看上面的程序。

 调用函数dataSet.fillna(100),如果不指定任何参数的时候,可以用一个数值来代替数据中的所有空值nan。如下如所示

也可以通过字典来将指定的地方的空值改为我们想要设置的值。

 调用函数dataSet.fillna(method='ffill'),这里我没有声明axis,则axis默认为0,即按照列进行处理,在这里空值nan将会由它所在的列的前一个不是空值的值来赋值给它。这里每一列空值的前一个值分别为1.0和5.0,则空值的值会等于他们所在列的这些值。如下图所示。

 调用函数dataSet.fill(method='bfill',limit=1),这里的method等于bfill,这里我没有声明axis,则axis默认为0,即按照列进行处理,在这里空值nan将会由它所在的列的后一个不是空值的值来赋值给它,并且我们限制,每一列最多只能填充一个空值,剩下的我们不管。如下图所示。

 关于inplace这个函数我们这里就不演示了,和上面的dropna函数的用法一致,默认是在数据的副本上进行的修改,原数据不会受改变。

总结:以上就是关于这两个函数的用法,在处理数据时,如果想要处理空值的话,这两个函数还是很有用的,能够得到我们想要的没有空值的数据。

编写不易,给个赞鼓励一下吧,转载请注明出处,每一个字都是纯手敲出来的。

如果问题,欢迎交流哈。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐