本文作者:杨长青

本文编辑:周聪聪

技术总编:张学人


当我们用python进行数据处理时会遇到很多缺失值,缺失值一般是由于我们所处理的数据本身的特性、当初录入的失误或者其它原因导致的,比如读入数据的空值、做0/0等计算时这些数据都被处理成缺失值。对于缺失值我们的处理或者直接删除或者进行填补,今天我们来介绍几个基础的缺失值处理函数:

dropna:删除缺失值

isna、notna:判断缺失值

fillna、interpolate:填补缺失值

接下来我们结合具体的例子来详细介绍上述函数用法。在DataFrame中缺失值的标签一般为NAN(not a number)。可以沿用numpy中np.nan定义缺失值。我们构造一个包含缺失值的简单例子:

importnumpy asnp

importpandas aspd

dict1={'make':['AMC Concord', np.nan,'AMC Spirit',np.nan,'Buick Electra ','AMC Pacer'],

'price':[4099,4749,np.nan,7824,np.nan,2154],

'rep78':[3,4,np.nan,5,np.nan,5]} #通过np.nan生成缺失值

auto=pd.DataFrame(dict1)

auto #展示auto

数据如下:


一、删除缺失值

dropna的语法介绍:

dataFrame.dropna(axis = 0,how ='any',thresh = None,subset = None,inplace = False )

axis:确定删除缺失值的行或列。axis=0:删除包含缺失值的行。axis=1:删除包含缺失值的列。

how:删除方式。how=’any’:删除包含缺失值的行或列。how=’all’:只有行或列都为缺失值才会被删除。

thresh:设置需要的非缺失值。当thresh=2:保存包含至少有两个非缺失值的行或列。

subset:沿着其他轴考虑的标签。假设删除行,可以指定subset=[‘make’]:删除缺失make变量数据的行。

inplace:是否对原数据集进行处理替换。inplace=True替换修改原对象。

对于上面的例子,我们想要删除price和rep78为空的观测,只需:

auto.dropna(subset=['make','rep78'])

最终输出如下:


二、判断缺失值

isna用来判断DataFrame元素是否大小写,返回相同大小的对象,如果是缺失值则为True,否则为False。而notna刚好相反,如果是缺失值则为False,否则为True。下面两图是auto数据集使用isna和notna判断的结果:


在数据处理的过程中,经常是要对各个特征下数据缺失的多少进行一个判断,对于缺失数较多的特征我们一般不会使用。isna很方便我们对缺失值进行统计,并按缺失值的比重排列。程序如下:

na_count = auto.isnull().sum().sort_values(ascending=False) #对bool数据进行累加并从大到小排列

na_rate = na_count / len(auto) #计算比率

na_data = pd.concat([na_count,na_rate],axis=1,keys=['count','ratio'])

na_data

输出如下:


三、填补缺失值

fillna的主要语法如下:

DataFrame.fillna(value = None,method= None, inplace= False,limit =None)

value:用于指定用何值填充缺失值。可以是一个标量,如value=0,用0填补所有缺失值。可以是一个字典,键为需要填充的列名,值为需要填充的内容。

method:指定填充的方式。method='ffill':用前面的补齐后面的缺失值。method='bfill' :用下一个非缺失值填充该缺失值。

inplace:如上定义。

limit:在指定method时,控制向前或向后填充缺失值的最大数量。

对于上述例子,我们将price和rep78的缺失值分别用均值和中位数进行替换:

value={'price':auto.price.mean(),

'rep78':auto.rep78.median() } #分别计算均值个中位数

auto.fillna(value)

替换之后,如下所示:


同时还可以使用插值法对缺失值进行填补,通过interpolate函数完成,默认为线性插值,即method='linear'。除此之外,还有‘linear’、‘time’等插值方法可供选择。这里我们就不再详细介绍。

以上介绍如何通过 Pandas 处理数据集中的缺失值,包括识别、删除、填补。