• sklearn机器学习编程练习大全(一)


    第1题 计算DataFrame每列的缺失值比例

    DataFrame如下:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'name': ['Zhangsan', 'Lisi', 'Wangwu', 'Zhaosi', 'Maliu', 'Zhouqi'],
        'hobby': ['basketball', 'football', 'badminton', np.nan, 'Table Tennis', np.nan],
        'gender': ['male', 'female', 'male', 'male', np.nan, 'female'],
        'weight': [130, 136, 120, 170, np.nan, np.nan]
    })
    

    先统计每列的空值个数,得到一个Series:

    df.isnull().sum()
    

    得到如下的Series:
    在这里插入图片描述
    接下来计算每列缺失值的比例,除以数据行数即可:

    df.isnull().sum() / len(df)
    

    保留两位小数,使用np.round()方法:

    np.round(df.isnull().sum() / len(df), 2)
    

    得到如下的Series:
    在这里插入图片描述
    完整代码如下:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'name': ['Zhangsan', 'Lisi', 'Wangwu', 'Zhaosi', 'Maliu', 'Zhouqi'],
        'hobby': ['basketball', 'football', 'badminton', np.nan, 'Table Tennis', np.nan],
        'gender': ['male', 'female', 'male', 'male', np.nan, 'female'],
        'weight': [130, 136, 120, 170, np.nan, np.nan]
    })
    
    # 计算每列的空值比例
    np.round(df.isnull().sum() / len(df), 2)
    

    第2题 填充缺失值

    DataFrame如下,要求填充weight列的缺失值,使用平均值进行填充:
    在这里插入图片描述
    使用sklearn进行填充缺失值,完整代码如下:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'name': ['Zhangsan', 'Lisi', 'Wangwu', 'Zhaosi', 'Maliu', 'Zhouqi'],
        'hobby': ['basketball', 'football', 'badminton', np.nan, 'Table Tennis', np.nan],
        'gender': ['male', 'female', 'male', 'male', np.nan, 'female'],
        'weight': [130, 136, 120, 170, np.nan, np.nan]
    })
    
    from sklearn.impute import SimpleImputer
    # 创建策略对象
    imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
    
    # 注意有两个中括号
    df[['weight']] = imputer.fit_transform(df[['weight']])    
    

    再来看一下新的DataFrame,可以看到weight列的缺失值已经被填充:
    在这里插入图片描述
    扩展,如何获取到用于填充缺失值的那个值呢?使用创建的imputer对象statistics_属性,得到的是一个数组array,并取出数组的第0个元素:

    imputer.statistics_[0]
    

    上述代码可以得到用于填充缺失值的值,为139.0。

    第3题 使用常量填充缺失值

    DataFrame如下,将weight列的缺失值使用100填充:
    在这里插入图片描述
    创建SimpleImputer对象时,传入strategy参数为constant,代表常量,再传入fill_value参数,值为100.0,代码如下:

    from sklearn.impute import SimpleImputer
    imputer = SimpleImputer(
        missing_values=np.nan,
        strategy='constant',
        fill_value=100.0
    )
    

    第4题 使用最频繁出现的值填充缺失值

    DataFrame依然使用第3题中的DataFrame,将gender列的缺失值使用该列最频繁出现的值进行填充,代码如下:

    from sklearn.impute import SimpleImputer
    imputer = SimpleImputer(
        missing_values=np.nan,
        strategy='most_frequent'
    )
    df[['gender']] = imputer.fit_transform(df[['gender']]) 
    

    第5题 过滤掉存在空值的行

    DataFrame依然使用第3题中的DataFrame,过滤掉也就是删除weight列中存在空值的行,代码如下:

    df[~df['weight'].isnull()]
    

    扩展:继续选取DataFrame中的数值列,并计算该列的均值。

    df[~df['weight'].isnull()].select_dtypes(include=['float']).mean()
    

    第6题 使用常量填充字符串列

    DataFrame依然使用第3题中的DataFrame,如何使用常量"常量"填充该DataFrame中字符串列的缺失值呢?首先创建策略对象,代码如下:

    from sklearn.impute import SimpleImputer
    imputer = SimpleImputer(missing_values=np.nan, strategy="constant", fill_value='常量')
    columns = df.select_dtypes(include=['object']).columns
    df.loc[:, columns] = imputer.fit_transform(df[columns])
    

    第7题 数值离散化

    如何对如下的DataFrame(学生成绩)进行数值离散化,将成绩分成三个等宽区间,并新增一列score_cut,对应的是每个成绩所在的区间?
    在这里插入图片描述
    使用pd.cut()方法,传入要进行cut的列,并传入参数bins,这里需要分成三个等宽区间,所以bins的值是3。代码如下:

    import pandas as pd
    df = pd.DataFrame(data = {'score': [95., 88., 90., 85., 100., 97.]})
    df['score_cut'] = pd.cut(df['score'], bins=3)
    

    得到的结果如下:
    在这里插入图片描述
    那么如何自己指定区间呢?代码如下:

    df['score_cut'] = pd.cut(df['score'], bins=[80, 85, 90, 95, 100])
    

    如何为区间指定标签呢?添加labels参数即可,代码如下:

    import pandas as pd
    
    df = pd.DataFrame(data = {'score': [95., 88., 90., 85., 100., 97.]})
    df['score_cut'] = pd.cut(df['score'], bins=[80, 90, 95, 100], labels=['bad', 'normal', 'good'])
    

    得到的结果如下:
    在这里插入图片描述

    第8题 虚拟编码

    对于第7题第1张图片中的DataFrame,如何对score列进行one-hot类型的虚拟编码?
    解决该问题需要使用pd.get_dummies()方法,代码如下:

    import pandas as pd
    
    df = pd.DataFrame(data = {'score': [95., 88., 90., 85., 100., 97.]})
    df['score_cut'] = pd.cut(df['score'], bins=[80, 90, 95, 100], labels=['bad', 'normal', 'good'])
    df = pd.get_dummies(df)
    

    得到的结果如下:
    在这里插入图片描述

    第9题 提取元素的个数

    学生爱好的DataFrame如下:
    在这里插入图片描述
    hobby列的每个元素都是一个列表,现在我们想要增加一列,对应的是每个学生爱好的数量,也就是hobby列中每个列表的长度,该如何操作呢?代码如下:

    import pandas as pd
    
    df = pd.DataFrame(data = {'hobby': [
        ['basketball', 'football'],
        ['tennis', 'badminton', 'game'],
        ['basketball', 'swimming', 'football', 'game', 'study'],
        []
    ]})
    df['hobby_num'] = df['hobby'].map(len)
    

    第10题 特征提取–是否包含某个元素

    初始的学生爱好的DataFrame见上题中的DataFrame,现要判断学生的爱好中是否包含basketball,新增一列basketball_flag,对应的是爱好列是否包含basketball,如果包含则为1,如果并不包含则为0,代码如下:

    import pandas as pd
    
    df = pd.DataFrame(data = {'hobby': [
        ['basketball', 'football'],
        ['tennis', 'badminton', 'game'],
        ['basketball', 'swimming', 'football', 'game', 'study'],
        []
    ]})
    df['basketball'] = df['hobby'].map(lambda x: 1 if 'basketball' in x else 0)
    
  • 相关阅读:
    Jmeter基础
    MaTiJi - MT2073 - 上传头像
    【无标题】
    CPU卡学习
    图的基本概念以及相关定义
    java知识3-----核心2-面向对象高级 续3
    2023 牛客国庆day4 【10.2训练补题】
    深度强化学习的组合优化[1] 综述阅读笔记
    waf、yakit和ssh免密登录
    如何做一个知识博主? 善用互联网检索
  • 原文地址:https://blog.csdn.net/lyccomcn/article/details/138843501