一、目的与要求
1)了解数据质量问题、掌握常用解决方法;
2)熟练掌握数据预处理方法,并使用Python语言实现;
二、实验设备与环境
PC机 + Python3.7环境(pycharm、anaconda或其它都可以)
三、实验内容
- 清洗与预处理的必要性
在实际数据挖掘过程中,我们拿到的初始数据,往往存在缺失值、重复值、异常值或者错误值,通常这类数据被称为“脏数据”,需要对其进行清洗。另外有时数据的原始变量不满足分析的要求,我们需要先对数据进行一定的处理,也就是数据的预处理。数据清洗和预处理的主要目的是提高数据质量,从而提高挖掘结果的可靠度,这是数据挖掘过程中非常必要的一个步骤。 - 具体要求如下:
数据清洗
(1)发现重复与冗余
设数据集如下:
{state’:[‘a’,‘b’,‘c’,‘a’,‘b’,‘c’],‘year’:[2018,2016,2017,2018,2016,2017],‘average’:[87,85,88,87,85,88]},试完成:
a) 统计所有数据全部重复的有多少?
b) 显示重复的数据是哪几个?
c) 把重复的删除,但是不要删除原始数据。
实验代码:
import pandas as pd
import numpy as np
# 导入数据
data = pd.DataFrame({'state': ['a', 'b', 'c', 'a', 'b', 'c'], 'year': [2018, 2016, 2017, 2018, 2016, 2017],
'average': [87, 85, 88, 87, 85, 88]})
print("原始数据如下:\n", data)
##统计重复数目
data_dulicated_num = np.sum(data.duplicated())
print("\n统计重复数目为:{}条".format(data_dulicated_num))
##显示重复数据
data_dulicated = data.loc[data.duplicated()]
print("\n重复数据如下:\n", data_dulicated)
##删除重复数据 保留第一个
data_drop = data.drop_duplicates(keep='first')
print("\n删除重复数据后的结果如下:\n", data_drop)
实验截图:
(2)处理缺失值
发现以及填充缺失值,设数据集如下:
{‘state’:[‘a’,‘b’,‘c’,np.nan,‘b’,‘c’],‘year’:[2018,2016,np.nan,2018,2016,2017],‘average’:[87,85,88,np.nan,85,88]}
请完成:
a) 统计行数及每列非空取值个数。
b) 统计每列缺失值的个数。
c) 把缺失值都填充为0。
d) 对于不同的列,动态指定不同列的填充值,第一列指定众数填充,第二列使用众数,第三列使用均值。
e) 运用自定义函数来填充, 假设自定义函数就是取众数的第一个值。
实验代码:
import pandas as pd
import numpy as np
data = pd.DataFrame({'state': ['a', 'b', 'c', np.nan, 'b', 'c'], 'year': [2018, 2016, np.nan, 2018, 2016, 2017],
'average': [87, 85, 88, np.nan, 85, 88]})
print("原始数据如下:\n", data)
##统计行数及每列非空取值个数
print("一共{}行".format(len(data.index)))
print("\n每列非空取值个数如下:\n", data.notnull().sum(axis=0))
##统计每列缺失值个数
print("\n每列缺失值个数:\n", data.isnull().sum(axis=0))
# 缺失值填充为0
print("\n缺失值填充为0结果如下:\n", data.fillna(0))
##4.对于不同的列,动态指定不同列的填充值,第一列指定众数填充,第二列使用众数,第三列使用均值
data['state'].fillna(data['state'].mode()[0], inplace=True)
data['year'].fillna(data['year'].mode()[0], inplace=True)
data['average'].fillna(value=data['average'].mean(), inplace=True)
print("\n动态指定不同列的填充结果如下:\n", data)
# 运用自定义函数来填充, 假设自定义函数就是取众数的第一个值
def SelfFunction(data):
return data.mode()[0]
data['state'].fillna(value=SelfFunction(data['state']), inplace=True)
data['year'].fillna(value=SelfFunction(data['year']), inplace=True)
data['average'].fillna(value=SelfFunction(data['average']), inplace=True)
print("\n运用自定义函数来填充结果如下:\n", data)
实验截图:
数据集成
设数据集如下:
dat1 = DataFrame({‘key’:[‘a’,‘b’,‘c’],
‘value1’:[1,2,3],
‘year’:[1998,1999,2001]})
dat2 = DataFrame({‘address:[‘Hangzhou’,‘Guangzhou’,‘Nanjing’],
‘type’:[‘l1’,‘l2’,‘l3’]})
dat3= DataFrame({‘key’:[‘a’,‘b’,‘c’],
‘value1’:[1,2,3],
‘year’:[1998,1999,2001]})
dat4 = DataFrame({‘key’:[‘d’,‘e’],
‘value1’:[43,32],
‘year’:[1989,1990]})
(1)将dat1与dat2列方向合并(列数增加方向),并输出。
(2)将dat3与dat4行方向合并(行数增加方向),并输出。
实验代码:
import pandas as pd
# 数据集成
dat1 = pd.DataFrame({'key': ['a', 'b', 'c'], 'value': [1, 2, 3], 'year': [1998, 1999, 2001]})
dat2 = pd.DataFrame({'address': ['zhengzhou', 'guangzhou', 'nanjing'], "type": ['11', '12', '13']})
dat3 = pd.DataFrame({'key': ['a', 'b', 'c'], 'value': [1, 2, 3], 'year': [1998, 1999, 2001]})
dat4 = pd.DataFrame({'key': ['d', 'e'], 'value': [43, 32], 'year': [1989, 1990]})
print("列合并:\n", pd.concat([dat1, dat2]))
print("行合并:\n", pd.concat([dat3, dat4], axis=0))
实验截图:
数据变换(统一格式并标准化)
设数据集如下:
{‘student’:[‘张山’,‘李尔’,‘王五’,‘赵明’,‘王迪’,‘肖晓’],
‘optional’:[3,4,2,5,3,4],
‘required’:[90,83,67,87,81,91],
‘ideology’:[‘优’,‘良’,‘良’,‘优’,‘及格’,‘优’]}
(1)将optional和required列进行归一化
(2)将optional和required列进行标准化
(3)试求各位同学的总评成绩。
其中归一化和标准化公式如下:
实验代码:
import pandas as pd
import numpy as np
# 数据变换
# 数据输入
# 将optional和required列进行归一化
data = pd.DataFrame({'student': ['张三', '李尔', '王五', '赵明', '王迪', '肖晓'], 'option': [3, 4, 2, 5, 3, 4],
'required': [90, 83, 67, 87, 81, 91], 'ideology': ['优', '良', '良', '优', '及格', '优']})
print("原始数据如下:\n", data)
data2 = data.copy()
data2['option'] = (data2['option'] - min(data2['option'])) / (max(data2['option'] - min(data2['option'])))
data2['required'] = (data2['required'] - min(data2['required'])) / (max(data2['required'] - min(data2['required'])))
print("\n将optional和required列进行归一化:\n", data2)
# 将optional和required列进行标准化
data3 = data.copy()
data3['option'] = (data3['option'] - np.mean(data3['option'])) / (data3['option']).std()
data3['required'] = (data3['required'] - np.mean(data3['required'])) / (data3['required']).std()
print("\n将optional和required列进行归一化:\n", data3)
# 试求各位同学的总评成绩。
# 归一化求总评
data4 = data2.copy()
# 设置优良及格分值
data4['ideology'].loc[data2['ideology'] == '优'] = 100
data4['ideology'].loc[data2['ideology'] == '良'] = 80
data4['ideology'].loc[data2['ideology'] == '及格'] = 60
# 将ideology数据归一化
data4['ideology'] = (data4['ideology'] - min(data4['ideology'])) / (max(data4['ideology'] - min(data4['ideology'])))
list = ['option', 'required', 'ideology']
# 添加新列
data4['总评'] = data4[list].apply(lambda x: x.sum(), axis=1)
print("\n归一化求总评:\n", data4)
#
# 标准化求总评
data5 = data3.copy()
data5['ideology'].loc[data3['ideology'] == '优'] = 100
data5['ideology'].loc[data3['ideology'] == '良'] = 80
data5['ideology'].loc[data3['ideology'] == '及格'] = 60
# 将ideology数据标准化
data5['ideology'] = (data5['ideology'] - np.mean(data5['ideology'])) / (data5['ideology']).std()
# 去除姓名栏
list = ['option', 'required', 'ideology']
# 添加新列
data5['总评'] = data5[list].apply(lambda x: x.sum(), axis=1)
print("\n标准化求总评:\n", data5)
实验截图:
1)列归一化:
2)列标准化:
3)归一化求总评
4)标准化求总评
四、实验小结
总结:
- 通过本次实验我学会了数据集成、数据清洗、及数据变换等数据处理的相关操作。
- Pandas是一个优秀的数学库,可以实现很多功能,值得深度研究和探索。
- 通过使用pands对所给的数据进行了重复数据的查询,行数据统计,以及统计哪些为重复值,缺失值的处理以及填充,可以使用0进行填充,或者指定数据进行填充。
- 了解并掌握了数据的索引与筛选,数据缺失的处理count统计,知道如何忽略NaN,以及使用fillna进行缺失值的填充,合并数据集等常操作。
- Apply函数相当于一个处理过滤函数,以及Lambda表达式的巧妙使用。
- 数据清洗具有很强的实操性,需要多多练习和写代码来实现,才能更好的运用。