数据挖掘 | 实验一 数据的清洗与预处理

一、目的与要求

1)了解数据质量问题、掌握常用解决方法;
2)熟练掌握数据预处理方法,并使用Python语言实现;

二、实验设备与环境

PC机 + Python3.7环境(pycharm、anaconda或其它都可以)

三、实验内容

  1. 清洗与预处理的必要性
    在实际数据挖掘过程中,我们拿到的初始数据,往往存在缺失值、重复值、异常值或者错误值,通常这类数据被称为“脏数据”,需要对其进行清洗。另外有时数据的原始变量不满足分析的要求,我们需要先对数据进行一定的处理,也就是数据的预处理。数据清洗和预处理的主要目的是提高数据质量,从而提高挖掘结果的可靠度,这是数据挖掘过程中非常必要的一个步骤。
  2. 具体要求如下:

数据清洗

(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)标准化求总评
在这里插入图片描述

四、实验小结

总结:

  1. 通过本次实验我学会了数据集成、数据清洗、及数据变换等数据处理的相关操作。
  2. Pandas是一个优秀的数学库,可以实现很多功能,值得深度研究和探索。
  3. 通过使用pands对所给的数据进行了重复数据的查询,行数据统计,以及统计哪些为重复值,缺失值的处理以及填充,可以使用0进行填充,或者指定数据进行填充。
  4. 了解并掌握了数据的索引与筛选,数据缺失的处理count统计,知道如何忽略NaN,以及使用fillna进行缺失值的填充,合并数据集等常操作。
  5. Apply函数相当于一个处理过滤函数,以及Lambda表达式的巧妙使用。
  6. 数据清洗具有很强的实操性,需要多多练习和写代码来实现,才能更好的运用。
  • 20
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MapReduce中进行数据清理可以分为多个阶段,第一阶段通常是数据清洗。下面简要介绍一下Java MapReduce实验中的数据清洗阶段。 数据清洗阶段的目的是将原始数据进行预处理,使得后续的计算能够更加准确和高效。具体而言,数据清洗阶段需要完成以下任务: 1. 去除无用数据:在数据中可能存在一些与计算无关的内容,比如注释、空行等,需要将这些内容去除。 2. 格式化数据:对于有些数据,可能存在格式上的不规范,需要将其进行规范化,比如日期格式、数字格式等。 3. 数据过滤:有些数据不符合计算要求,需要将其过滤掉。 4. 数据转换:有些数据需要进行转换,比如将字符串转为数字、将时间戳转为日期等。 下面是一个简单的Java MapReduce程序,用于进行数据清洗。该程序的输入为一个文本文件,包含多条记录,每条记录由多个字段组成,字段之间用逗号分隔。程序的输出为清洗后的数据集,每条记录仅包含需要的字段,并且字段之间用逗号分隔。 ```java public class DataCleanMapper extends Mapper<LongWritable, Text, NullWritable, Text> { private Text outputValue = new Text(); private StringBuilder builder = new StringBuilder(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] fields = value.toString().split(","); if (fields.length >= 5) { // 只保留前5个字段,其余字段丢弃 for (int i = 0; i < 5; i++) { builder.append(fields[i]).append(","); } builder.deleteCharAt(builder.length() - 1); outputValue.set(builder.toString()); context.write(NullWritable.get(), outputValue); builder.setLength(0); } } } ``` 该程序的主要逻辑如下: 1. 将输入的文本文件按行读取,每行数据作为一个键值对的value。 2. 根据逗号将每行数据分割成多个字段。 3. 判断字段个数是否大于等于5,如果是,则只保留前5个字段,其余字段丢弃。 4. 将清洗后的数据作为一个键值对的value,写入输出文件中。键使用NullWritable.get()表示不需要指定键,输出的value为Text类型,值为清洗后的数据。 该程序的输出结果为清洗后的数据集,每条记录仅包含需要的字段,并且字段之间用逗号分隔。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值