5.2 清洗数据

news2024/11/14 22:32:06

5.2 清洗数据

  • 5.2.1 检测与处理重复值
    • 1、记录重复 drop_duplicates()
    • 2、特征重复 equals()
  • 5.2.2 检测与处理缺失值 isnull()、notnull()
    • 1、 删除法 dropna()
    • 2、替换法 fillna()
    • 3、 插值法
  • 5.2.3 检测与处理异常值
    • 1、3σ原则
    • 2、箱线图
  • 5.2.4 任务实现(wei)

  数据重复会导致数据的方差变小,数据分布会发生较大变化。缺失会导致样本信息减少,不仅增加了数据分析的难度,而且会导致数据分析的结果发生偏差。因此要对数据进行检测,查询是否有 重复值缺失值异常值,并且要对这些数据进行适当的处理。

5.2.1 检测与处理重复值

  常见的数据重复分为两种:
一种为记录重复,即一个或者多个特征的某几条记录的值完全相同;
另一种为特征重复,即存在一个或者多个特征名称不同,但数据完全相同的情况。

1、记录重复 drop_duplicates()

方法一:利用列表list去重;

### 方法一:利用list去重
import pandas as pd
path = 'E:/Input/py/5_2_1_BE-Lon.csv'
df = pd.read_csv(path)
# 方法一:定义去重函数
def delRep(list1):
    list2 = []
    for i in list1:
        if i not in list2:
            list2.append(i)
    return list2
# 去重
dff = list(df['Date'])
print("前:", len(dff))
print(dff)
data1 = delRep(dff)
print("后:", len(data1))
print(data1)

在这里插入图片描述

方法二:利用集合set元素唯一的特性去重,但是这种方法会导致数据的排列顺序发生变化;

# 方法二: 使用set去重,但是set()会导致数据的排列发生改变
# dff = list(df['Date'])
print("前:", len(dff))
print(dff)
data2 = set(dff)
print("后:", len(data2))
print(data2)

在这里插入图片描述

方法三:pandas提供了一个名为drop_duplicates的去重方法。该方法只对DataFrame或者Series类型有效。这种方法不会改变数据原始排列,并且兼具代码简洁和运行稳定的特点。该方法不仅支持单一特征的数据去重,还能够依据DataFrame的其中一个或者几个特征进行去重操作。

pandas.DataFrame(Series).drop_duplicates(self, subset=None, keep=‘first’, inplace=False)

在这里插入图片描述

# 方法三: 使用drop_duplicates()方法去重
print("前:", len(dff))
print(dff)
data3 = df['Date'].drop_duplicates()
print("后:", len(data3))
print(data3)

在这里插入图片描述

  drop_duplicates()去重方法不仅支持单一特征的数据去重,还能够依据DataFrame的其中一个或者几个特征进行去重操作。

# 使用drop_duplicates()方法对多列去重
path = 'E:/Input/py/5_2_1_BE-Lon.csv'
df = pd.read_csv(path)
print("前:", df.shape)
print(df)
drop2 = df.drop_duplicates(subset = ['Date', 'NDVI'])
print("后:",  drop2.shape)
print(drop2)

2、特征重复 equals()

  结合相关的数学和统计学知识,去除连续的特征重复,可以利用特征间的相似度将两个相似度为1的特征去除一个。在pandas中相似度的计算方法为corr,使用该方法计算相似度时,默认为“pearson”法 ,可以通过“method”参数调节,目前还支持“spearman”法和“kendall”法。
corr()是相关矩阵,是DataFrame内置函数,不用另外调包也能生成。
corr()括号里面没有填参数时默认是皮尔逊相关系数,corr(method = ‘pearson’);
corr(method = ‘spearman’),斯皮尔曼等级相关系数,用来分析非正态分布的数据;
corr(method = ‘kendall’),秩相关系数,用来分析两定序变量相关关系;

## 2、特征重复
# 求出两列数据的kendall法相似度矩阵
# 求取LE和SWC的相似度
path = 'E:/Input/py/5_2_1_BE-Lon.csv'
df = pd.read_csv(path)
corrDet = df[['LE', 'SWC']].corr()
print(corrDet)
corrDet = df[['LE', 'SWC']].corr(method='kendall')
print(corrDet)
corrDet = df[['LE', 'SWC']].corr(method='spearman')
print(corrDet)

在这里插入图片描述
  但是通过相似度矩阵去重存在一个弊端,该方法只能对数值型重复特征去重,类别型特征之间无法通过计算相似系数来衡量相似度,因此无法根据相似度矩阵对其进行去重处理。
  除了使用相似度矩阵进行特征去重之外,可以通过DataFrame.equals的方法进行特征去重。

# 使用DataFrame.equals方法去重
path = 'E:/Input/py/5_2_1_BE-Lon.csv'
df = pd.read_csv(path)
# print(df)
## 定义求取特征是否完全相同的矩阵的函数
def FeatureEquals(df):
    dfE = pd.DataFrame([], columns = df.columns, index=df.columns)
    for i in df.columns:
        for j in df.columns:
            dfE.loc[i,j] = df.loc[:,i].equals(df.loc[:,j])
    return dfE
# 应用
detEquals = FeatureEquals(df)
print(detEquals)
# 再通过遍历的方式选出完全重复的特征
## 遍历所有数据
lenDet = detEquals.shape[0]
print(lenDet)
dupCol = []
for m in range(lenDet):
    for n in range(m+1, lenDet):
        if detEquals.iloc[m,n] & \
        (detEquals.columns[n] not in dupCol): 
            dupCol.append(detEquals.columns[n])
# 进行去重操作
print("需要删除的列为:", dupCol)
df.drop(dupCol, axis=1, inplace = True)
print(df)

5.2.2 检测与处理缺失值 isnull()、notnull()

  利用isnullnotnull找到缺失值。
  数据中的某个或某些特征的值是不完整的,这些值称为缺失值。
pandas提供了识别缺失值的方法isnull以及识别非缺失值的方法notnull,这两种方法在使用时返回的都是布尔值True和False。
  结合sum函数和isnull、notnull函数,可以检测数据中缺失值的分布以及数据中一共含有多少缺失值。

# 5.2.2 检测与处理缺失值
path = 'E:/Input/py/5_2_2_BE-Lon.csv'
df = pd.read_csv(path)
print(df)
print("每个特征缺失的数目:", df.isnull().sum())
print("每个特征非缺失的数目:", df.notnull().sum())

在这里插入图片描述
  isnull和notnull之间结果正好相反,因此使用其中任意一个都可以判断出数据中缺失值的位置。

1、 删除法 dropna()

  删除法是将含有缺失值的特征或者记录删除。删除法分为删除观测记录和删除特征两种,它属于利用减少样本量来换取信息完整度的一种方法,是一种最简单的缺失值处理方法。
pandas中提供了简便的删除缺失值的方法dropna(),该方法既可以删除观测记录,亦可以删除特征。

pandas.DataFrame.dropna(self, axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

在这里插入图片描述

# 使用dropna方法删除缺失值  # 把含有缺失值的行都删了
data1 = df.dropna(axis=0, how='any')
print(data1.shape)
print(data1)

在这里插入图片描述

2、替换法 fillna()

  替换法是指用一个特定的值替换缺失值。
  特征可分为数值型和类别型,两者出现缺失值时的处理方法也是不同的。
  缺失值所在特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值。
  缺失值所在特征为类别型时,则选择使用众数来替换缺失值。
  pandas库中提供了缺失值替换的方法名为fillna,其基本语法如下。

pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)

在这里插入图片描述

# 2、替换法
data1 = df.fillna(-9)
print(data1.shape)
print(data1)

在这里插入图片描述

3、 插值法

  删除法简单易行,但是会引起数据结构变动,样本减少;替换法使用难度较低,但是会影响数据的标准差,导致信息量变动。在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法—插值法。
  线性插值是一种较为简单的插值方法,它针对已知的值求出线性方程,通过求解线性方程得到缺失值。
  多项式插值是利用已知的值拟合一个多项式,使得现有的数据满足这个多项式,再利用这个多项式求解缺失值,常见的多项式插值法有拉格朗日插值和牛顿插值等。
  样条插值是以可变样条来作出一条经过一系列点的光滑曲线的插值方法,插值样条由一些多项式组成,每一个多项式都是由相邻两个数据点决定,这样可以保证两个相邻多项式及其导数在连接处连续。

# 3、插值法
import pandas as pd
import numpy as np
from scipy.interpolate import interp1d  ## 注意是数字1
path = 'E:/Input/py/5_2_2_BE-Lon.csv'
df = pd.read_csv(path)
# print(df)
# 1、线性插值
linear_lai = df['LAI'].interpolate(method='linear')
print(linear_lai)
x = np.array([1, 2, 3, 4, 5, 8, 9])
y = np.array([2, 8, 18, 32, 50, 128, 162])
LinearInsValue = interp1d(x, y, kind='linear')
print(LinearInsValue([6, 7]))

# 2、拉格朗日插值法
from scipy.interpolate import lagrange
LargeInsValue = lagrange(x, y)
print(LargeInsValue([6, 7]))

# 3、样条插值
from scipy.interpolate import make_interp_spline
SplineInsValue = make_interp_spline(x, y)
print(SplineInsValue([6, 7]))

在这里插入图片描述
  从拟合结果可以看出多项式插值和样条插值在两种情况下拟合都非常出色,线性插值法只在自变量和因变量为线性关系的情况下拟合才较为出色。
  而在实际分析过程中,自变量与因变量的关系是线性的情况非常少见,所以在大多数情况下,多项式插值和样条插值是较为合适的选择。
  SciPy库中的interpolate模块除了提供常规的插值法外,还提供了例如在图形学领域具有重要作用的重心坐标插值(BarycentricInterpolator)等。在实际应用中,需要根据不同的场景,选择合适的插值方法。

5.2.3 检测与处理异常值

  异常值是指数据中个别值的数值明显偏离其余的数值,有时也称为离群点,检测异常值就是检验数据中是否有录入错误以及是否含有不合理的数据。
  异常值的存在对数据分析十分危险,如果计算分析过程的数据有异常值,那么会对结果会产生不良影响,从而导致分析结果产生偏差乃至错误。
  常用的异常值检测主要为3σ原则箱线图分析两种方法。

1、3σ原则

  3σ原则又称为拉依达法则。该法则就是先假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常值。
  这种判别处理方法仅适用于对正态或近似正态分布的样本数据进行处理,如下表所示,其中σ代表标准差,μ代表均值,x=μ为图形的对称轴。
  数据的数值分布几乎全部集中在区间(μ-3σ,μ+3σ)内,超出这个范围的数据仅占不到0.3%。故根据小概率原理,可以认为超出3σ的部分数据为异常数据。
在这里插入图片描述

# 5.2.3 使用3σ原则识别异常值
# print(df)
## 定义3σ原则来识别异常值函数
path = 'F:/书籍/Python数据分析与应用/37304_Python数据分析与应用_源代码和实验数据/第5章/data/detail.csv'
df = pd.read_csv(path,encoding='gbk')
def outRange(Serl):
    boolInd = (Serl.mean() - 3*Serl.std() > Serl) | \
    (Serl.mean() + 3*Serl.var() < Serl)
    index = np.arange(Serl.shape[0])[boolInd]
    outrange = Serl.iloc[index]
    return outrange

outliner = outRange(df['counts'])
# print(df['counts'])
# print(outliner)
print(outliner.shape[0])
print(outliner.max())
print(outliner.min())

在这里插入图片描述

2、箱线图

  箱型图提供了识别异常值的一个标准,即异常值通常被定义为小于QL-1.5IQR或大于QU+1.5IQR的值。
QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小。
QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大。
IQR称为四分位数间距,是上四分位数QU与下四分位数QL之差,其间包含了全部观察值的一半。
  箱线图依据实际数据绘制,真实、直观地表现出了数据分布的本来面貌,且没有对数据做任何限制性要求,其判断异常值的标准以四分位数和四分位数间距为基础。
  四分位数给出了数据分布的中心、散布和形状的某种指示,具有一定的鲁棒性,即25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值通常不能对这个标准施加影响。鉴于此,箱线图识别异常值的结果比较客观,因此在识别异常值方面具有一定的优越性。

import matplotlib.pyplot as plt
plt.figure(figsize = (10,8))
p = plt.boxplot(df['counts'].values, notch=True)  # 画出箱线图
outlier1 = p['fliers'][0].get_ydata()  # fliers为异常值的标签
plt.show()
print("销售量数据异常值个数为:", len(outlier1))
print("销售量数据异常值的最大值为:", max(outlier1))
print("销售量数据异常值的最小值为:", min(outlier1))

在这里插入图片描述

5.2.4 任务实现(wei)

p152

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习HCIP的day.12

目录 MPLS&#xff1a;多协议标签交换 一、协议的解释和意义 二、工作过程 1、控制层面&#xff1a; 2、数据层面&#xff1a; 三、标签号 四、MPLS的次末跳 五、MPLS的配置 六、使用mpls解决BGP的路由黑洞 七、MPLS VPN 八、配置&#xff1a; 1、ISP部分 MPLS&am…

python+pyqt制作的可最小化到托盘的桌面图形应用代码实例

本篇文章主要讲解使用python、pyqt制作的可以最小化到托盘的桌面图形应用实例。 日期:2023年6月11日 作者:任聪聪 效果演示 说明:实现桌面应用显示窗口,关闭窗口缩小到托盘,点击托盘显示窗口,邮件图标显示退出按钮,点击退出按钮即可关闭应用。 动态演示: 实际情况:…

postgresql 服务的启动操作,不再是DBA的专属

专栏内容&#xff1a;postgresql个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 服务架构概述 服务启动流程 前提 流程 集群创建 集群介绍 数据库服务配置 数据…

202317读书笔记|《心寂犹似远山火:斋藤茂吉短歌300》——茫茫心海里,孤帆与谁同

202317读书笔记&#xff5c;《心寂犹似远山火&#xff1a;斋藤茂吉短歌300》——茫茫心海里&#xff0c;孤帆与谁同 很高兴周五这一天&#xff0c;之前很粉俳句的时候订阅的书都在今天都上架了&#xff0c;可以一饱眼福了。短歌是日本和歌一种诗体&#xff0c;是由三十一音节组…

YOLOv5/v7 添加注意力机制,30多种模块分析③,GCN模块,DAN模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、GCN 模块1、GCN 模块的原理2、实验结果3、应用示例 三、DAN模块1、DAN模块的原理2、实验结果3、应用示例 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xf…

扫雷——C语言实现

扫雷 文章目录 扫雷实现代码什么是扫雷基本功能实现显示选择菜单定义几个二维数组&#xff1f;确定数组大小初始化数组布置地雷打印展示数组排查地雷记录指定区域周围地雷的个数判断排雷成功排查地雷实现代码 基本功能的实现代码和效果展示 拓展功能简化游戏界面改变字体颜色实…

[创业之路-73] :如何判断一个公司或团队是熵减:凝聚力强、上下一心,还是,熵增:一盘散沙、乌合之众?

目录 前言&#xff1a; 一盘散沙、乌合之众&#xff1a; 凝聚力强、上下一心&#xff1a; 一、股权结构与利益分配 一盘散沙、乌合之众 凝聚力强、上下一心 二、组织架构与岗位职责 一盘散沙、乌合之众 凝聚力强、上下一心 三、战略目标 一盘散沙、乌合之众 凝聚力…

碳排放预测模型 | Python实现基于MLP多层感知机的碳排放预测模型(预测未来发展趋势)

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 ![1](https://img-blog.csdnimg.cn/34c113bde2 文章概述 碳排放预测模型 | Python实现基于MLP多层感知机的碳排放预测模型(预测未来发展趋势) 研究内容 这是数据集的链接:https://github.com/…

【伏羲八卦图】(PythonMatlab实现)

目录 1 与达尔文对话 2 与老子对话 2.1 Python实现 2.2 Matlab实现 1 与达尔文对话 140年前&#xff0c;1858年7月1日&#xff0c;达尔文在英伦岛发表了自己有关自然选择的杰出论文。他提出&#xff0c;生物的发展规律是物竞天择。经过物竞&#xff0c;自然界选择并存留最具…

【CAD】【动态块】CAD设置动态块

文章目录 1 CAD的动态块及应用2 块的相关概念2.1 块的相关命令2.1.1 创建块BLOCK2.1.2 插入块INSERT2.1.3 编辑块BEDIT2.1.4 重命名块RENAME 2.2 CAD组&#xff08;group&#xff09;和块&#xff08;block&#xff09;的区别2.3 “块”&#xff08;block&#xff09;和“写块”…

CMake学习(6): 打印日志信息及宏定义

1. message 打印日志 介绍CMake中的调试打印命令Message, 可以为用户显示一条消息&#xff0c;并在终端上打印显示。假如&#xff0c;我们通过File命令对文件进行了搜索&#xff0c;但是不能确定搜索到的文件就是我们需要的文件。此时&#xff0c;可以利用message将搜索到的变…

PS 套索选区工具(2) 多边形套索工具 磁性套索工具使用技巧

上文PS 套索选区工具(1) 套索工具基础使用带大家了解了套索工具的基本操作 这边 我们右键套索工具 它还有个 多边形套索工具 多边形套索工具是用来画直线的 我们选中它 然后 我们鼠标点击一下 然后 移动到指定位置 从你点的位置开始 到结束的地方 就会形成一个直线的选区 点…

SpringBoot项目编译运行时提示“程序包xxx不存在,找不到符号”

今天想要在虚拟机上部署自己的前后端项目&#xff0c;在系统打包时碰到了这个问题&#xff0c;记录一下 1. 项目结构&#xff0c;启动程序再pub-oa-web项目中 2、编译异常报错分析 编译中报错是在其他子项目中都配置了如下代码&#xff0c;导致项目每个子项目都是可执行的&am…

第五章数组

我们之前学习&#xff0c;如果我们存储一个值&#xff08;或者说只有一个值在改变&#xff09;那么我们使用变量&#xff1b; 但是如果我们需要存储多个值&#xff0c;因该怎么办呢&#xff01; 1 数组 1.1 概念 数组Array&#xff0c;标志是[ ] ,用于储存多个相同类型数据的集…

JDBC 连接池 详解(通俗易懂)

目录 一、前言 二、传统连接方式的弊端分析 1.局限性 : 2.几个弊端 : 三、数据库连接池 1.基本介绍 : 2.示意图如下 : 3.连接池种类 : 四、C3P0连接池 0.准备工作 : 1.方式一 —— 程序中指定相关参数 : 2.方式二 —— 通过配置文件 : 五、Druid&#xff08;德鲁伊…

Vue中如何进行路由懒加载

Vue中如何进行路由懒加载 路由懒加载是一种优化Vue应用程序性能的技术。它可以延迟加载路由组件&#xff0c;从而减少应用程序的初始加载时间&#xff0c;提高应用程序的性能。本文将介绍Vue中如何进行路由懒加载&#xff0c;包括使用Vue异步组件和Webpack代码分割。 使用Vue异…

Docker本地私有仓库、harbor私有仓库部署与管理

目录 一、本地私有仓库1、本地私有仓库简介2、搭建本地私有仓库3、容器重启策略介绍 二、harbor私有仓库部署与管理1、什么是harbor2、Harbor的特性3、Harbor的构成4、harbor部署及配置①部署docker-compose②部署Harbor服务③登录创建项目④登录仓库并上传镜像 5、客户端测试①…

Python 基于 Django 的学生成绩管理系统,可视化界面

1简介 对于学生成绩管理系统&#xff0c;充分运用现代化的信息技术手段&#xff0c;对于学生成绩信息管理发展的趋势就是信息化&#xff0c;信息化时代下的信息管理&#xff0c;需要深化信息管理体制与手段的改革&#xff0c;充分运用信息化手段来全方位的进行学生成绩管理系统…

Vue中如何进行数据响应式更新?

Vue中如何进行数据响应式更新&#xff1f; Vue是一款流行的JavaScript框架&#xff0c;它提供了数据响应式更新的能力&#xff0c;可以让我们轻松地更新数据&#xff0c;并自动更新视图。本文将介绍Vue中如何进行数据响应式更新&#xff0c;包括使用Vue的响应式系统、使用计算…

nacos-sdk-rust binding for Python

广告时间 nacos-sdk-rust-binding-py : nacos-sdk-rust binding for Python with PyO3. Tip: nacos-sdk-python 仓库暂未提供 2.x gRPC 交互模式&#xff0c;为了能升级它&#xff0c;故而通过 ffi 方式调用 nacos-sdk-rust py 包 -> https://pypi.org/project/nacos-sdk-r…