datawhale-动手学数据分析task2笔记

动手学数据分析task2

数据清洗及特征处理

缺失值观察与处理

  1. .isnull().isna()可判断表中所有缺失值,缺失值处为True,优先用.isna()

  2. .isna().sum()可以获得columns的缺失值数量。

  3. .info()可以获得dataframe中columns的non-null值,从而推断出缺失值数量。

  4. .dropna()方法可以处理dataframe数据的缺失值,对缺失值行或者列删除。

    '''
    参数说明:
    axis=0/1,0删除行
    how='any'/'all'即筛选方式,any为有Nan即删,all则是全为Nan才会删除
    tresh=None/int,其中为非空元素最低数量,如果行/列元素数量小于tresh的值则会删除
    subset=None/list,其中为筛选的columns或index,作用是筛选判断范围
    inplace=Bool,如果True则替换原dataframe
    ignore_index=Bool, 如果True则会在删除缺失值后重置索引
    '''
    
    #以下为参数的默认值
    df.dropna(axis=0, how='any', tresh=None, subset=None,  inplace=False, ignore_index=False)
    
  5. .fillna()方法可以处理dataframe数据的缺失值,对缺失值进行填充。

    '''
    参数说明:
    value=None/any,其值是填充缺失值的值
    method='bfill'/'ffill'/None即填充方法,ffill表示用前面行/列的值,bfill表示用后面行/列的值,填充当前行/列的空值  
    (目前已不推荐method参数,可以用.ffill()和.bfill()代替,但其无limit参数)
    axis=0/1,沿其填充缺失值的轴
    limit=None/int,是填充连续缺失值的最大数量(与method方法一起用,所以也不推荐)
    inplace=Bool,如果True则替换原dataframe
    '''
    
    # 以下参数为默认参数
    df.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
    
  6. 三种简单方法填充缺失值。

    # method1
    >>> df[df.isna()] = 1
    
    >>> pd.isna(np.nan) # True
    >>> np.nan == np.nan # False
    >>> np.nan is np.nan # True
    # None != NaN
    
  7. 检索空值最好用isna(),理由如上。

重复值观察与处理

  1. .duplicated()方法可以找出表中数据的重复值。

    '''
    参数说明:
    subset=None/list,是需要标记重复的标签或标签序列
    keep='first'/'last'/'False',是重复数据的标记方法。  
    first将除第一次出现以外的重复数据标记为True,last将除最后一次出现以外的重复数据标记为True,
    False将所有重复数据标记为True。  
    '''
    
    # 以下参数为默认参数
    df.duplicated(subset=None, keep='first')
    
  2. drop_duplicates()方法可以删除表中数据的重复值。

    '''
    参数说明:
    subset=None/list,是需要标记重复的标签或标签序列
    keep='first'/'last'/'False',是重复数据的标记方法,同duplicated()。
    inplace=Bool,是是否替代。
    '''
    
    # 以下参数为默认参数
    df.drop_duplicates(subset=None, keep='first', inplace=False)
    

特征观察与处理

  1. 数据分箱(分桶/离散化)指的是以特定的条件将所有元素分类,实现数据的离散化,增强数据的稳定性。本质上就是把数据进行分组。

  2. 进行数据分箱的三种方法。

    • loc & between

      '''
      参数说明:
      将column中所有数据大小在bin(r1, r2)中的数据进行增添新label,需要对每个bin编写分箱代码,所以一般都是bin很少时使用。
      
      between()函数中left为左边界,right为右边界,inclusive为是否包含哪个边界。
      inclusive='left'/'right'/'both',可省略三个关键词。  
      '''
      
      df.loc[df['column'].between(left=r1, right=r2, inclusive='both'), 'new_column'] = 'label'
      
    • cut

      '''
      参数说明:
      - x=df.['column'],是要分箱的column,必须是一维的。
      - right=Bool,是否包含最右边的边缘。
      - bins=list/number,list中元素是分箱每个bin的范围或number表示几分位数。
      - labels=list,list中是指定返回的bin的标签。必须与上面的 bins 参数长度相同(一一对应)。
      - include_lowest=Bool 第一个区间是否应该是左包含的。
      - precision=int 精度,表示小数几位。
      - duplicates=default/'raise'/'drop',如果bin边缘不是唯一的,'raise'则引发 ValueError而'drop'删除非唯一的。
      - retbins=Bool,是否返回bin的边界list。
      - ordered=Bool,表示标签是否有序。
      '''
      
      # 以下有具体值的为默认值
      df['new_column'] = pd.cut(x=df['column'], right=True, bins = [range], labels = [label], include_lowest = False, precision=3, duplicates=default, retbins=False, ordered=True)
      
    • qcut

      '''
      参数说明:
      - x=df['column'],是要分箱的column,必须是一维的。
      - q=number/list,number表示几分位数,4表示四分位数等。list是分数list,例如[0, .25, .5, .75, 1.] 四分位数。
      - labels=list,list中是指定返回的bin的标签。必须与上面的 bins 参数长度相同(一一对应)。
      - retbins=Bool,是否返回bin的边界list。
      - precision=int,精度,表示小数几位。
      - duplicates=default/'raise'/'drop',如果bin边缘不是唯一的,'raise'则引发 ValueError而'drop'删除非唯一的。
      '''
      
      # 以下有具体值的为默认值
      df['new_column'],cut_bin = pd.qcut(x=df['column'], q=number, labels=[label], retbins=False, precision=3, duplicates=default)
      
  3. 查看columns的数据类型可以使用.dtypes方法或.info(),查看类别文本变量名及分类可以使用.value_counts()方法和.unique()方法(前者可获得统计数量),nunique()方法可获得类别数量。

    >>> df.dtypes
    '''
    输出:
    PassengerId       int64
    Survived          int64df
    Fare            float64
    Cabin            object
    Embarked         object
    Age group      category
    dtype: object
    '''
    
    >>> df['Sex'].value_counts()
    '''
    输出:
    Sex
    male      453
    female    261
    Name: count, dtype: int64
    '''
    
    >>> df['Sex'].unique()
    '''
    输出:
    array(['male', 'female'], dtype=object)
    '''
    
    >>>df['Sex'].nunique()  # 输出: 2
    
  4. 将文本标签替换成数值型标签的三种方法。

    • replace

      '''
      参数说明:
      - to_replace=None/label/list...,其值是被replace的label或label list...
      - value=None/label/list...,其值是replace的label或label list...
      - inplace=Bool,如果True则替换原dataframe
      - regex=Bool,如果True则开启正则表达式匹配替换
      '''
      
      # 以下有具体值的为默认值
      series.replace(to_replace=None, value=None, inplace=False, regex=False)
      
    • map

      '''
      参数说明:
      - arg为映射的字典或函数
      - na_action=None/'ignore',处理NaN值时,如果是ignore则会传播NaN不对NaN映射
      '''
      
      # 以下有具体值的为默认值
      series.map(func, na_action=None)
      
    • LabelEncoder

      # 引入LabelEncoder
      >>> from sklearn.preprocessing import LabelEncoder
      # 创建encoder
      >>> encoder = LabelEncoder()
      # 向encoder中放入list,将n个类别编码为0~n-1之间的整数(包括0和n-1)
      >>> encoder.fit([a, b, c])
      # 使用encoder (标准化)
      >>> answer = encoder.transform([b, c, a, a])
      >>> answer  # 输出:[1, 2, 0, 0]
      
  5. 文本数据提取用.extract()方法。

    train_data['Title'] = train_data['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
    
    '''
    参数说明:
    - pat='str'/'正则表达式'
    - flags=int ,是来自re模块的标志
    - expand=Bool,True则返回每个捕获组有一列的数据框。False如果有一个捕获组,则返回序列/索引;如果有捕获组,则返回数据框。
    '''
    
    # 以下有具体值的为默认值
    Series.str.extract(pat='', flags=0, expand=True)
    
posted @ 2024-03-13 22:38  LPF05  阅读(19)  评论(0编辑  收藏  举报