• Python学习笔记:Pandas数据转换编码的10种方式


    一、背景

    机器学习中针对分类特征常常需要进行编码处理,将文本类型的数据转换为数值类型。

    例如:将男女转换为0/1标签,以便模型训练。

    二、测试

    1.构建测试数据集

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
            'Sex': ['M','F','M','M','M','F','M','F','F','F'],
            'Course': ['English','C','Math','Python','Java','PHP','Linux','SQL','Python','C++'],
            'Score': np.random.randint(0,100,10)
            })
    '''
      Sex   Course  Score
    0   M  English     22
    1   F        C     20
    2   M     Math     89
    3   M   Python     13
    4   M     Java     68
    5   F      PHP     49
    6   M    Linux     97
    7   F      SQL      5
    8   F   Python     15
    9   F      C++     83
    '''
    

    2.自定义函数 + 循环遍历

    def myFun(x):
        if x > 90:
            return 'A'
        elif x >= 80 and x < 90:
            return 'B'
        elif x >= 70 and x < 80:
            return 'C'
        elif x >= 60 and x < 70:
            return 'D'
        else:
            return 'E'
        
    df['Score_label'] = None
    for i in range(len(df)):
        df.iloc[i, 3] = myFun(df.iloc[i, 2])
    

    3.自定义函数 + map

    df['Score_label_2'] = df['Score'].map(myFun)
    

    4.自定义函数 + apply

    df['Score_label_3'] = df['Score'].apply(lambda x: 'A' if x > 90 
      else ('B' if 90 > x >= 80
            else ('C' if 80 > x >= 70
                  else ('D' if 70 > x >= 60
                        else 'E'))))
    

    apply执行速度堪忧,针对大数据量尽量避免。

    5.pd.cut

    bins = [0, 59, 70, 80, 90, 100]
    df['Score_label_4'] = pd.cut(df['Score'], bins)
    # labels可以直接设定标签
    df['Score_label_4'] = pd.cut(df['Score'], bins, labels=['E','D','C','B','A'])
    

    注意:左右开闭区间的设定。

    6.sklearn二值化

    from sklearn.preprocessing import Binarizer
    binarizer_ = Binarizer(threshold=60)
    df['Score_label_5'] = binarizer_.fit_transform(np.array(df['Score']).reshape(-1,1))
    

    7.replace替换

    df['Sex_label'] = df['Sex'].replace(['M','F'], [0,1])
    

    8.value_counts()转换dict指定

    利用 value_counts() 进行去重统计,转换为标签。

    value_map = dict((v, i) for i, v in enumerate(df['Course'].value_counts().index))
    
    df['Course_label'] = df.replace({'Course': value_map})['Course']
    

    9.set + map

    Map = {v: i for i, v in enumerate(set(df['Course']))}
    '''
    {'Math': 0,
     'C': 1,
     'Linux': 2,
     'English': 3,
     'Java': 4,
     'PHP': 5,
     'C++': 6,
     'Python': 7,
     'SQL': 8}
    '''
    
    df['Course_label_2'] = df['Course'].map(Map)
    

    10.astype转换类型

    value = df['Course'].astype('category')
    df['Course_label_3'] = value.cat.codes
    

    转换为:类别类型。

    11.sklearn.preprocessing.LabelEncoder

    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    le.fit(df['Sex'])
    df['Sex_label_2'] = le.transform(df['Sex'])
    
    le2 = LabelEncoder()
    df['Course_label_4'] = le2.fit_transform(df['Course'])
    

    12.sklearn.preprocessing.OrdinalEncoder

    一次性转换多个列,OrdinalEncoderLabelEncoder 区别在于前者支持数组的转换,后者仅支持单独一列。

    from sklearn.preprocessing import OrdinalEncoder
    
    le3 = OrdinalEncoder()
    le3.fit(df[['Sex', 'Course']])
    
    df[['Sex_label_3', 'Course_label_5']] = le3.transform(df[['Sex', 'Course']])
    

    13.factorize

    以上几种自动生成字典的编码方式,基本都是无序的,不固定的。

    # 根据出现的顺序编码
    df['Course_label_6'] = pd.factorize(df['Course'])[0]
    

    利用 factorize 可以实现顺序编码。

    结合匿名函数,可以实现对多列进行有序编码。

    cat_columns = df.select_dtypes(['object']).columns
    
    df[['Sex_label_4','Course_label_7']] = df[cat_columns].apply(lambda x: pd.factorize(x)[0])
    

    参考链接:Pandas 很难用?

  • 相关阅读:
    vue路由跳转的方式(一)
    ElementUi树形目录
    Element UI问题总结
    angular入门
    IntelliJ IDEA 指定Java编译版本
    Python 笔记 v1
    Typora极简教程
    Gitbook在Windows上安装
    IntelliJ IDEA中查看UML类图
    服务器最大连接数问题
  • 原文地址:https://www.cnblogs.com/hider/p/16186040.html
Copyright © 2020-2023  润新知