【数据分析】第二章数据清洗及特征处理

第二章数据清洗及特征处理

缺失值观察与处理

  1. 查看缺失值个数

    df.isnull().sum() #返回一维数据,检查每列数据为空的个数
    df.info() #返回一维数据,检查每列数据不为空的个数
    
  2. 对缺失值进行处理

    df.loc[df['列名'].isnull(),'列名']=0 #轴标签索引,而不是从0 →N-1的下标
    
    df.fillna({'列名':0}) #对该列空值数据赋0,生成副本,不改变原文件
    
    df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
    参数说明:
    axis:axis=0: 删除包含缺失值的行axis=1: 删除包含缺失值的列
      how: 与axis配合使用
        how=any:只要有缺失值出现,就删除该行货列
        how=all: 所有的值都缺失,才删除行或列
    thresh:axis中至少有thresh个非缺失值,否则删除
      比如 axis=0,thresh=10:标识如果该行中非缺失值的数量小于10,将删除改行
    subset: list 在哪些列中查看是否有缺失值
    inplace: 是否在原数据上操作。如果为真,返回None否则返回新的copy,去掉了缺失值。`
    

重复值观察与处理

  • 查看重复值

    df.duplicated() #返回一维数据,返回每一列是否有重复值,有为True,没有为False
    df[df.duplicated()] #返回二维数据(表)
    
  • 删除重复值

    df.drop_duplicates() #删除重复值,第一行和第二行重复,第二行为重复数据,删除第二行
    

数据特征观察与处理

  • 数据特征分为两类:数值型特征和文本型特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

  • 对数据进行分箱(离散化)处理

    pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)
    参数说明
      x:分箱时输入的数组,必须为一位数组
      bins:分类依据的标准,可以是int、标量序列或间隔索引(IntervalIndex)
      right:是否包含bins区间的最右边,默认为True,最右边为闭区间,False则不包含
      labels:要返回的标签,和bins的区间对应
      retbins:是否返回bins,当bins作为标量时使用非常有用,默认为False
      precision:精度,int类型
      include_lowest:第一个区间是否为左包含(左边为闭区间),默认为False,表示不包含,True则包含
      duplicates:可选,默认为{default 'raise', 'drop'},如果 bin 边缘不是唯一的,则引发       ValueError 或删除非唯一的。
      ordered:默认为True,表示标签是否有序。如果为 True,则将对生成的分类进行排序。如果为 False,   则生成的分类将序的(必须提供标签)
    
    ex:
    1. 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
      df['Age bins']=pd.cut(df['Age'],5,labels=list('12345'))
    2. 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
       df['Age bins']=pd.cut(df['Age'],[0,5,15,30,50,80],right=False) #不用labels对每一段命名,默认为[0,5) [5,15) [15,30) [30,50) [50,80)
       df['Age bins']=pd.cut(df['Age'],[0,5,15,30,50,80],right=False,labels=list('12345'))  #命名后                           
    3.将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示                         df['Age bins']=pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],duplicates='drop',labels=list('12345'))           
    

对文本变量进行操作

  • 查看文本变量名及种类

    df['列名'].unique() #显示列名的数据的种类,例如sex列的种类为male和female
    
  • 将文本变量用数值变量12345表示

    df['列名'].replace(['待替换文本1','待替换文本2',...],[1,2,...],inplace=True)  #适用于该列种类少的,易于替换
    
    from sklearn.preprocessing import LabelEncoder #导入LabelEncoder,利用fit_transform函数
    df['列名']=LabelEncoder().fit_transform(df['列名']) #系统自动用合适数值替换,适用于类别多的列,替换列原有数据
    
  • 将文本变量用one-hot编码表示

    • one-hot编码:形成一个01表,符合该列数值为1,不符为0
    x=pd.get_dummies(df[列名],prefix=列名) #将该列文本种类生成一个表
    df=pd.concat([df,x],axis=1) #将生成的表接在原表后面
    

    在这里插入图片描述

  • 从纯文本Name特征里提取Titles的特征(所谓Titles就是Mr,Miss,Mrs等)

df['Title']=df.Name.str.extract('([A-Za-z]+)\.') #提取符号 . 之前的文本

数据重构

合并数据

  1. concat方法(将数据根据不同的轴作简单的融合,可合并行和列)

    • pd.concat( [df数据1, df数据2, …… ], axis = 01, join = 连接方式, keys = 表明数据来源 )
       ex: result_up=pd.concat([left_up,right_up],axis=1)
           result_down=pd.concat([left_down,right_down],axis=1)
           result=pd.concat([result_up,result_down])
      
    • 参数说明:

      objs: series,dataframe或者是panel构成的序列lsit
      axis: 需要合并链接的轴,0是行,1是列,默认为0
      join:连接的方式 inner,或者outer

  2. join方法(只能合并列,把列横向合并)

    • join(other,on=None,how=“left”,lsuffix=" “,rsuffix=” ",sort=False)
       ex: up=left_up.join(right_up)
      
    • 参数说明:

      on:用于连接名。 //如果两个表中行索引和列索引重叠,那么当使用join()方法进行合并 时,使用参数on指定重叠的列名即可
      how:可以从{“left”,“right”," outer",“inner”} 中任选一个,默认使用left的方式。
      lsuffix:接收字符串,用于在左侧重叠的列名后添加后缀名。
      rsuffix:接收字符串,用于在右侧重叠的列名后添加后缀名。
      sort:接收布尔值,根据连接键对合并的数据进行排序,默认为False。
      join()方法默认使用的左连接方式,即以左表为基准,join()方法进行合并后用左表索引为合并后的表的索引

      关于how:https://blog.csdn.net/MsSpark/article/details/83098468?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165320961516782390557692%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165320961516782390557692&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-83098468-null-null.142

      在这里插入图片描述
      在这里插入图片描述

  3. append方法(把行纵向合并,返回一个新对象)

    • append(other, ignore_index=False, verify_integrity=False,sort=None)
       ex: result=up.append(down)
      
    • 参数说明:

      other:DataFrame、series、dict、list这样的数据结构

      ignore_index:默认值为False,如果为True则不使用index标签

      verify_integrity :默认值为False,如果为True当创建相同的index时会抛出ValueError的异常

      sort:boolean,默认是None,该属性在pandas的0.23.0的版本才存在

  4. merge方法:

    • merge(DataFrame2, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’))
        ex: up=pd.merge(left_up,right_up,left_index=True,right_index=True)#后两个参数表示用行索引来拼接(合并列),默认为列索引
      
    • 参数说明

      在这里插入图片描述

stack方法

  1. stack会把数据的列变成行

  2. data_unit=data.stack()
    

    在这里插入图片描述

数据聚合与运算

数据运用

​ https://zhuanlan.zhihu.com/p/101284491

  1. groupby机制

    • df.groupby('列名') #对df按照性别分组,不返回结果
      list(df.groupby('列名'))[0] ##对df按照性别分组,返回结果(list),[0]表示显示前面的索引,本题前面是female
      

      在这里插入图片描述

    • ex:
      df.groupby('Sex')['Fare'].describe() #以性别分组,不同性别的船费情况船费
      a=df.groupby(['Pclass','Age'])['Fare'].mean() # 查看不同仓位等级不同年龄的票价情况的均值
      
  2. agg聚合操作

    • groupby后非常常见的操作

    • min--最小值  max--最大值  sum--求和 mean--均值
      median--中位数 std--标准差 var--方差 count--计数
      
    • ex:
        df.groupby('Sex').agg({'Survived':'sum','Fare':'mean'}).rename(columns={'Survived':'Survived_sum','Fare':'Fare_mean'}) #agg里面对survived和fare列分别进行了求和及求均值的操作,rename是对两列重新命名
      

格式化输出

  1. '最大存活率:{}'.format(rate)
    # 输出:最大存活率:0.432,,rate=0.432
    

数据可视化

  1. 常见的可视化图案

    • 柱形图:根据柱形的高低来描绘数据的基本变量,为了图像的视觉接受程度,通常一组数据不超过十个。
    • 折线图:使用线条的形式反映数据随时间的变化趋势,数据越多时,反映的趋势过程越准确,折线图通常处理的数据以时间变化为主要依据点。
    • 饼图:展现形式与圆饼相似,将数据按照百分比的形式进行展示对比。人的肉眼对于百分比的精确度掌握不足,在选择数据时,以不超过六个为佳。
    • 散点图:三维数据的应用图,对于数据的划分也是依据多个不同的指标进行,散点图中单个数据的作用不明显,数据量越大,散点图的作用越明显,将数据集中的区域作为数据的分类标准。
    • 雷达图:它通常作用于四维数据(不常见),按照多属性的划分标准进行区分。它所应用的数据量也不宜太多,否则容易从视觉的角度变得混乱。
  2. 利用循环作图

    #unique_pclass为已排好序的舱位等级(123)
    for i in unique_pclass:
        df.Age[df.Pclass==i].plot() #制作一个不同年龄的舱位等级的折线图
    #循环结束
    plt.legend(unique_pclass)
    
  3. matplotlib作图

    • #条件
      import matplotlib.pyplot as plt #导入包
      对象为DataFrame
      sex=df.groupby('Sex')['Survived'].sum()
      
    • 柱状图:

      df.plot.bar() #柱状图
      plt.title('xxx') #给图命名
      df.plot(kind='bar',stacked='True') # stacked参数将柱形图堆叠,方便观察
      plt.xlabel('xxx')  #给x轴取名
      plt.ylabel('xxx')  #给y轴取名
      
    • 折线图

      fare.plot()  #折线图
      plt.title('xxx') #给图命名
      df.plot.density() #绘制折线图,且纵轴用密度表示
      plt.legend((0,1)) #给曲线赋0,1,方便观察
      plt.xlabel('xxx')  #给x轴取名
      plt.ylabel('xxx')  #给y轴取名
      
    • 直方图

      df.hist(bins=5,alpha=0.5,density=1) # bins是平均分段个数,alpha是直方图的透明度,density=1是指按密度显示值(y轴)
      plt.title('xxx') #给图命名
      plt.legend((0,1)) #给方块赋0,1,方便观察
      plt.xlabel('xxx') #给x轴取名
      plt.ylabel('xxx') #给y轴取名
      
  4. unstack(将列的数据堆叠成行,从一维数据变成二维数据)

    https://blog.csdn.net/fullbug/article/details/122916628?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165331077116782391832752%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165331077116782391832752&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-122916628-null-null.142

    在这里插入图片描述
    在这里插入图片描述

  5. seaborn作图

    import seaborn as sns #导入
    sns.kdeplot(df.Age[df.Pclass==1],shade=True,linewidth=0) #作图
    # shade=True,填充满折线图和x轴间的空间
    #linewidth=0,折线的宽度
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值