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)