DW-动手学数分02(数据清洗及特征处理)

1 数据清洗

  • 数据清洗:我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗

1.1 缺失值观察与处理

1.1.1 缺失值观察

  • 查看数据信息:df.info()
    df.info()
    
    在这里插入图片描述
  • 查看缺失值个数:df.isnull().sum()
    df.isnull().sum()
    

在这里插入图片描述

  • 查看指定列的数据
    df[['Age','Cabin','Embarked']].head()
    

1.1.2 缺失值处理

  • 处理缺失值的几种思路:

    • 1 删除缺失值样本
    • 2 可能值插补缺失值
  • 对缺失值的判断处理

    • 1判断是否为None
    df[df['Age']==None]=0
    df.head(3)
    

    在这里插入图片描述

    • 2判断是否为np.nan
    df[df['Age'] == np.nan] = 0
    df.head(3)
    

    在这里插入图片描述

    注意:检索空缺值用np.nan要比用None好,因为数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan

    • 3.isnull()
    df[df['Age'].isnull()] = 0
    df.head(3)
    

    在这里插入图片描述

  • 删除缺失值函数:dropna()

    • 格式:DataFrame.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)
    • 参数:
      • axis:默认为0,0按行删除,1按列删除
      • how:any是指有缺失值的所有行/列,all是指一整行/列都是缺失值的行/列
      • inplace:默认是False,即筛选后的数据存为副本,True是直接在原数据上修改
    df.dropna().head(3)
    

    在这里插入图片描述

  • 填充缺失值函数:fillna()

    注:如果列是lnt类型就0;如果是str就用nan

    # 用0填充缺失值
    df.fillna(0).head(3)
    

    在这里插入图片描述

1.2 重复值观察与处理

1.2.1 重复值观察

  • 观察重复值函数:duplicated()
    • 作用:查找并显示数据表中的重复值

    注意:
    1 当亮条记录中所有的数据都相等时,duplicated()才会判断为重复值
    2 duplicated()支持从前向后(first)【默认】,和从后向前(last)两种查找模式
    3 默认是first模式,也就是后面的条目在重复值判断中显示为True

    • 用法:

      • 1 查询重复值的位置
        DataFrame.duplicated()
      # 查看Age列的重复值位置
      df['Age'].duplicated()
      

      在这里插入图片描述

      • 2 检查有多少重复值
        DataFrame.duplicated().sum()
      df.duplicated().sum()
      # 176
      
      • 3 打印重复值
        DataFrame[DataFrame.duplicated()]
      df[df.duplicated()]
      

      在这里插入图片描述

1.2.2 重复值处理

  • 清除重复值函数:drop_duplicates()

    • 格式:DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
    • 参数:
      • subset: 列名,默认所有的列
      • keep: 是否保留{‘first’, ‘last’, False}。
        • 【默认】keep= ‘first’ 表示去重时每组重复数据保留第一条数据,其余数据丢弃;
        • keep=‘last’ 表示去重时每组重复数据保留最后一条数据,其余数据丢弃;
        • keep=False 表示去重时每组重复数据全部丢弃,不保留
      • inplace: 是否替换{False, True},【默认】inplace=False表示去重之后不覆盖原表格数据,inplace=True表示去重之后原表格数据被覆盖
    # 对整行有重复值的清除
    df.drop_duplicates().head()
    

2 特征处理

2.1 特征分类

  • 特征大概分为两类:
    • 数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
    • 文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。
  • 建模需要的特征:
    数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

2.2 分箱(离散化)操作

  • 分箱解释:
    • 什么是分箱:
      简单点说就是将不同的东西,按照特定的条件放到一个指定容器里

    比如水果,把绿色的放一个篮子里,红色一个篮子等等,这个篮子就是箱,而水果就是数据,颜色就是条件

    • 什么数据要分箱:
      数据主要分为连续变量和分类变量,分箱的操作主要针对于连续变量
    • 分箱操作的作用:
      在建模中,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险
  • 分箱类别:
    分箱分为有监督和无监督
    • 有监督:就是个人确定范围区间
      • 方法:python 中主要使用cut方法
    • 无监督:让代码自己划分组
      • 方法:使用的是qcut方法
  • cut()函数
    • 格式:pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
    • 常用参数:
      • x:类array对象,且必须为一维,待切割的原形式
      • bins: 整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量。如果bin是序列,它定义了允许非均匀in宽度的bin边缘
      • right:布尔值。是否是左开右闭区间
      • labels:用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元
    # 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
    df['AgeBand'] = pd.cut(df['Age'], 5,labels = ['1','2','3','4','5'])
    df.head()
    
    #将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
    df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = ['1','2','3','4','5'])
    df.head(3)
    
    #将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
    df['AgeBand'] = pd.cut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = ['1','2','3','4','5'])
    df.head()
    

2.3 对文本变量进行转换

  • 查看文本变量名及种类

    • 方法一:value_counts
    df['Sex'].value_counts()
    

    在这里插入图片描述

    • 方法二:unique
    df['Sex'].unique()
    '''
    array(['male', 'female', 0], dtype=object)
    '''
    
    df['Sex'].nunique()
    # 2
    
  • 文本转换

    • 将类别文本转换为12345
    • 方法一:replace
    df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
    df.head()
    

    在这里插入图片描述

    • 方法二:map
    df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
    df.head()
    

    在这里插入图片描述

    • 方法三:使用sklearn.preprocessingLabelEncoder
    from sklearn.preprocessing import LabelEncoder
    for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
    
    df.head()
    
    • 将类别文本转换为one-hot编码
    • 方法一: OneHotEncoder
    for feat in ["Age", "Embarked"]:
    #     x = pd.get_dummies(df["Age"] // 6)
    #     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    #df[feat] = pd.get_dummies(df[feat], prefix=feat)
    
    df.head()
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值