您现在的位置是:网站首页 > 博客日记 >

数据预处理|数据清洗|使用Pandas进行缺失值清洗

作者:YXN-python 阅读量:79 发布日期:2023-03-25

数据预处理--缺失值清洗

  • 缺失值处理方法: 1) 删除法 2) 替换法 3) 插补法
  • Pandas 使用浮点值 NaN 表示缺失数据,以下介绍 pandas 处理缺失值的常用的操作:

1. 缺失值的检测与统计

使用pandas的DataFrame对象类。

  • isnull()(或notnull())方法可以直接判断该列中的哪个数据为NaN,缺失值时为True(或False),非缺失值时为False(或True)。
  • info() 方法查看非缺失值的信息
  • isnull().sum() 方法统计出各列缺失值的数量。

代码示例如下:

import numpy as np
import pandas as pd
df=pd.DataFrame( [['1','张秀',21,'团员',np.NaN,np.NaN], ['2','李峰',20,np.NaN,'信息系','贵州'], ['3','王元',22,np.NaN,'计算机系',np.NaN]], columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
print(df) #打印出各列数据的非缺失值信息 print(df.info()) #打印出缺失值信息,缺失值时为True,非缺失值时为False print(df.isnull()) #打印出各列中缺失值的数量 print(df.isnull().sum())

2. 删除缺失值

根据一定的规则将含有缺失值的行或列直接进行删除。dropna() 为Pandas库中DataFrame的一个方法,用于删除缺失值。常用形式如下:

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

import numpy as np
import pandas as pd
df=pd.DataFrame( [['1','张秀',21,'团员',np.NaN,np.NaN], ['2','李峰',20,np.NaN,'信息系','贵州'], ['3','王元',22,np.NaN,'计算机系',np.NaN]], columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
#删除含有缺失值的行 print("删除含有缺失值的行:\n",df.dropna()) #删除含有缺失值的列 print("删除含有缺失值的列:\n",df.dropna(axis=1)) #保留至少具有5个非NaN值的行 print("保留至少具有5个非NaN值的行:\n",df.dropna(thresh=5)) #保留至少具有3个非NaN值的列 print("保留至少具有3个非NaN值的列:\n", df.dropna(thresh=3,axis=1))

3.  填充缺失值

缺失值所在的属性为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来填充;
缺失值所在属性为类别型数据时,则可以选择众数来填充。

Pandas 库中提供了缺失值替换的方法 fillna() ,常用形式如下:

fillna(value=None,method=None,asxi=None,inplace=False,limit=None)

 

常见的填充方法有:

1. 填充固定值:选取某个固定值/默认值填充缺失值。

2. 填充均值:对每一列的缺失值,填充当前列的均值。

3. 填充中位数:对每一列的缺失值,填充当前列的中位数。

4. 填充众数:对每一列的缺失值,填充当前列的众数。如果存在某列缺失值过多,众数为NaN的情况,这时就取每列删除掉NaN值后的众数。

5. 填充上下样本的数据:对每一数据样本的缺失值,填充其上面一个或下面一个样本的数据值。

6. 填充插值得到的数据:用插值法拟合出缺失的数据,然后进行填充。常用interpolate()函数默认采用线性插值,即假设函数是直线形式,缺失值用前一个值和后一个值的平均数填充。

7. 填充KNN数据:填充近邻的数据,先利用KNN计算临近的k个数据,然后填充它们的均值。

8. 填充模型预测的值:把缺失值作为新的Label,建立模型得到预测值,然后进行填充。

import numpy as np
import pandas as pd
df=pd.DataFrame( [['1','张秀',21,'团员',np.NaN,np.NaN], ['2','李峰',np.NaN,np.NaN,'信息系','贵州'], ['3','赵峰',np.NaN,np.NaN,'信息系','贵州'], ['4','王元',24,np.NaN,'计算机系',np.NaN]], columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
print(df.fillna(-1)) #填充缺失值为'-1' print(df.fillna(method='ffill')) #向下填充缺失值 #年龄列的缺失值用其均值填充 print(df['年龄'].fillna(df['年龄'].mean())) print(df.fillna(df.mode())) #利用众数填充缺失值 for n in df: df[n]=df[n].interpolate() #数值型属性用线性插值 df[n].dropna(inplace=True) print(df)

YXN-python

2023-03-25