缺失数据(missing data)在数据分析应用中很常见。Pandas使用浮点值NaN(Not a Number)表示浮点和非浮点数组中的缺失数据,Python内置的None值和NumPy的浮点类型“np.nan”都会被当作Pandas的空值“NaN”处理。Pandas中可以通过isnull()判断各个单元格是否为空,如代码清单4-13所示。
代码运行结果如下:
以phone.csv文件(图4-1)为例,该CSV文件存在数据缺失、数据错误的情况。Pandas读取CSV文件后,会前将它包含的3种异常数据n/a、NaN和NA自动当作异常数据NaN来处理,见代码清单4-14。
图4-1 phone.csv文件
代码运行结果如下:
从上面例子可以看到,Pandas把n/a、NaN和NA当作空值数据自动识别,值为“/”和“-”的单元格不是空数据,但也不符合分析要求。这种情况下,可以指定空数据类型,通过na_values参数进行自定义空值数据设置与判断,如代码清单4-15所示。
代码运行结果如下:
通过isnull()判断各个单元格是否为缺失值后,接下来就是对缺失值进行处理,如果一个变量(列)缺失值较多,就可以把该变量删除。在Pandas中可以使用dropna()将缺失值删除,其格式为:DataFrame.dropna(axis= 0 , how= 'any' , thresh= None , subset= None , inplace= False )。其中主要参数说明见表4-1。
以代码清单4-15中的df为例,删除所有有缺失值的列,代码为:df. dropna (axis= 1 )。
表4-1 dropna()主要参数说明
代码运行结果如下:
如果只想保留非缺失值≥3个的变量,代码为:df. dropna (thresh= 3 ,axis= 1 )。
代码运行结果如下:
如果想删除所有包含缺失值的行和列,代码为:df.dropna()。
代码运行结果如下:
dropna()返回一个新的DataFrame,不会修改原数据。如果想要修改原数据DataFrame,可以使用参数inplace=True。此外,还有个很常用的参数subset,可以指定删除有空值的行,如代码清单4-16所示。
代码运行结果如下:
代码运行结果为删除了“Brand”列中包含空值的数据行。