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)
  • 24
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值