[黑马程序员Pandas教程]——Pandas缺失值处理

目录:

  1. 学习目标
  2. 空值和缺失值
  3. 查看缺失值
    1. 加载数据并通过info函数初步查看缺失值情况
    2. df.isnull().sum()空值数量统计
    3. Missingno库对缺失值的情况进行可视化探查
      1. 安装missingno库
      2. missingno.bar(df)缺失值数量可视化
      3. missingno.matrix(df)缺失值位置的可视化
      4. missingno.heatmap(df)缺失值之间相关性可视化
  4. 缺失值的处理
    1. dropna删除缺失值
    2. fillna固定值填充缺失值
    3. fillna前后值填充缺失值
    4. interpolate线性插值
  5. 总结:
  6. 项目地址

1.学习目标

  • 知道空值和缺失值的区别以及缺失值的影响

  • 知道如何查看数据集缺失值情况的方法

  • 知道缺失值处理的办法

 2.空值和缺失值

  • 在Pandas中空值和缺失值是有区别的,缺失值包含了空值
  • 好多数据集都含缺失数据。缺失数据有多重表现形式

    • 数据库中,缺失数据表示为NULL

    • 在某些编程语言中用NANone表示

    • 缺失值也可能是空字符串''或数值 0

    • 在Pandas中使用NaN表示缺失值

      • Pandas中的NaN值来自Numpy库,Numpy中缺失值有几种表示形式:NaN,NAN,nan,他们都一样

    • 除了Pandas中的空值以外,上述类型的缺失值都可以使用replace函数统一替换为NaN

  • NaN表示空值

    • NaN是pandas中的特殊的数据结构,来源于numpy包的特殊数据结构

    • NaN毫无意义

      • NaN不等于0

      • 也不等于空字符串

      • 更不等于布尔值False

      • 并且两个NaN也不相等

# 使JupyterNotebook单个cell可以有多个输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'from numpy import NaN,NAN,nan# 缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空字符串
NaN==True
NaN==False
NaN==0
NaN==''
NaN==None# 两个NaN也不相等
NaN==NaN
NaN==nan
NaN==NAN
nan==NAN

 3.查看缺失值

加载数据并通过info函数初步查看缺失值情况
  • 加载印度城市空气质量数据集,并初步查探缺失值

import pandas as pd# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
print(city_day)
print(city_day.info())
  •  isnull函数和notnull函数判断是否存在空值
import pandas as pd# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 空值返回True
print(city_day.isnull())
print(city_day['PM2.5'].isnull())
  •  isnull的返回值中存在True,`any()`就返回True
import pandas as pd# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')print(city_day.isnull().any())
print(city_day.isnull().any().any())
print(city_day['PM2.5'].isnull().any())
  • notnull函数和notna函数相同,判断是否存在非空值;与isnull函数对应,返回结果正好相反

import pandas as pd# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 空值返回False
print(city_day.notna())
print(city_day['PM2.5'].notna())

 

df.isnull().sum()空值数量统计
import pandas as pd# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 空值数量统计
print(city_day.isnull().sum())
print(city_day['PM2.5'].isnull().sum())
# 非空值数量统计
print(city_day.notnull().sum())
print(city_day['PM2.5'].notnull().sum())
Missingno库对缺失值的情况进行可视化探查
  • 可以使用第三方库Missingno来对缺失值进行可视化
安装missingno库
  • pip install missingno
missingno.bar(df)缺失值数量可视化
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 查看缺失值数量
city_day.isnull().sum()
# 查看非缺失值数量
city_day.notna().sum()
# 可视化查看缺失值数量情况
msno.bar(city_day)
plt.show()
missingno.matrix(df)缺失值位置的可视化
  • `missingno.matrix(df)` 可以快速直观的查看缺失值的分布情况
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')msno.matrix(city_day)
plt.show()
# 对数据集进行随机取样后再查看数据缺失情况
msno.matrix(city_day.sample(100))
plt.show()
missingno.heatmap(df)缺失值之间相关性可视化
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')msno.heatmap(city_day)
plt.show()

**返回结果如下**:相关性取值 0 不相关,1强相关,-1强负相关

4.缺失值的处理

  • 缺失值的处理方法有以下几种方式:
    • 删除缺失值:删除缺失值会损失信息,并不推荐删除,当缺失数据占比较低的时,或可以忽略相关性时,可以尝试使用删除缺失值
    • 填充缺失值:填充缺失值是指用一个估算的值来去替代缺失数
      • 平均值、中位数
      • 前后值填充,数据呈现顺序变化的时候可以使用缺失值前边或后边的值进行填充
  • 线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值
dropna删除缺失值 

使用`dropna`函数来删除空值,具体用法如下

# 函数用法
df.dropna(axis=0, how='any', inplace=True, subset=['列名',...],thresh=10
)df.drop() # 按列删除
  • dropna函数参数解释

    • axis=0

      • 可选参数 ,默认为0按行删

      • 0, or 'index':删除包含丢失值的行

      • 1, or 'columns':删除包含丢失值的列

    • how='any'

      • 可选参数,默认为any

      • any: 如果存在NA值,则删除该行或列

      • all: 如果所有值都是NA,则删除该行或列

    • inplace=False

      • 可选参数,不建议使用这个参数

      • 默认False, 不对原数据集进行修改

      • inplce=True,对原数据集进行修改

    • subset接收一个列表

      • 可选参数,不与thresh参数一起使用

      • 接收一个列表,列表中的元素为列名: 对特定的列进行缺失值删除处理

    • thresh=n

      • 可选参数

      • 参数值为int类型,按行去除NaN值,去除NaN值后该行剩余数值的数量(列数)大于等于n,便保留这一行

  • 示例代码如下

# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 构造示例数据集
city_day2 = city_day.sample(n=10, random_state=5)
print(city_day2)
msno.matrix(city_day2)
plt.show()city_day2 = city_day2.dropna(how='any', subset=['PM10'])
print(city_day2)
msno.matrix(city_day2.dropna(how='any', subset=['PM10']))
plt.show()
 fillna固定值填充缺失值
  • 用平均值填充PM2.5的缺失值

# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 构造示例数据集
city_day3 = city_day.copy()
msno.matrix(city_day3)
plt.show()# 计算PM2.5平均值
pm25_mean = city_day3['PM2.5'].mean()
print(pm25_mean)# fillna函数填充缺失值,将返回值赋值给原来的列
city_day3['PM2.5'] = city_day3['PM2.5'].fillna(pm25_mean)# 查看填充完缺失值的数据集
msno.matrix(city_day3)
plt.show()
 fillna前后值填充缺失值

时序数据在某一列值的变化往往有一定线性规律,绝大多数的时序数据,具体的列值随着时间的变化而变化,所以对于有时序的行数据缺失值处理可以使用上一个非空值或下一个非空值填充

印度城市空气质量数据明显就是一个时序数据集,空气中的各种成分会随着时间变化而变化,不会出现特别大的急剧变化

  • 使用上一个非空值(参数method='ffill')填充Xylene(二甲苯)的空值

# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 构造示例数据集
city_day3 = city_day.copy()# 用上一个非空值填充并赋值指定列
city_day3['Xylene'] = city_day3['Xylene'].fillna(method='ffill')
msno.matrix(city_day3)
plt.show()
  • 使用下一个非空值(参数method='ffill')填充整个数据集的空值

# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 构造示例数据集
city_day3 = city_day.copy()city_day3 = city_day3.fillna(method='bfill')
msno.matrix(city_day3)
plt.show()
interpolate线性插值

绝大多数的时序数据,具体的列值随着时间的变化而变化。 因此,除了使用bfill和ffill进行插补以外还可以使用线性插值法:它假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值。

  • 使用df.interpolate(limit_direction="both") 对缺失数据进行线性填充

# 导包
import pandas as pd
import matplotlib.pyplot as plt# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')# 拷贝数据集
city_day4 = city_day.copy()
# 线性插值填充,并赋值
city_day4 = city_day4.interpolate(limit_direction='both')
# 画图查看
city_day4['PM2.5'][50:65].plot()
plt.show()
city_day['PM2.5'][50:65].plot()
plt.show()

5.总结:

  • 缺失值会影响分析计算的结果,这个结果又要用来指导生产经营,所以要重视缺失值
  • 空值仅指Pandas中的空值类型,比如`NaN`
  • 缺失值包含空值,也有可能是空字符串、数字0、False或None等
  • 不是空值的缺失值可以通过`replace`函数先替换为`NaN`空值,之后再按空值进行处理
  • 查看空值
    • `df.info()` 可以查看数据集每一列非空值的数量
    • `isnull` & `notnull`函数 判断是否存在空值
    • `df.isnull().sum()` 统计空值数量
    • `missingno`库可以对空值进行可视化探查
      • `missingno.matrix(df)` 查看缺失值的位置
      • `missingno.heatmap(df)` 查看缺失值之间的相关性
  • 缺失值的处理
  • `df.dropna()` 删除缺失值
  • `df.fillna(具体值)` 将缺失值填充为具体指
  • `df.fillna(method='ffill')` 使用上一个非空值进行填充
  • `df.fillna(method='bfill')` 使用下一个非空值进行填充
  • `df.interpolate(limit_direction='both')` 线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值

 6.项目地址

Python: 66666666666666 - Gitee.com

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

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

相关文章

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图: Sapera Configuration 缓存与内存管理,以及通信端口配置工具,部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…

搭建的maven仓库如何在本地配置maven下载仓库以及仓库下载优先级

打开maven的settings.xml文件首先可配置maven的本地仓库路径 <localRepository>D:\java\apache-maven-3.6.3\resourceRoot</localRepository> 配置自己搭建的maven的服务名以及账号密码 <server><id>xxxxServer</id><username>xxxx</us…

15套前端经典实战项目大合集,小白练手必备实战项目

15套前端经典实战项目大合集&#xff0c;悄悄练习&#xff0c;你会惊艳所有人。 今日我以内卷为荣&#xff0c;明日内卷以我为荣&#xff0c;不管学习哪门语言都要做出实际的东西来&#xff0c;这个实际的东西就是项目。 这里整理了15前端经典实战项目&#xff0c;每套都有完…

Redis 扩展 RedisBloom 插件,解决缓存击穿、穿透

文章目录 一、概述二、编译准备2.1 升级 make2.2 安装 Python3 三、编译 RedisBloom四、测试 RedisBloom五、应用场景5.1 缓存击穿5.2 缓存穿透5.3 原理总结 六、存在的问题 如果您对Redis的了解不够深入请关注本栏目&#xff0c;本栏目包括Redis安装&#xff0c;Redis配置文件…

使用CMake引入第三方so库及头文件并调用头文件声明的函数

首先,要调用别人的so库和头文件,我们自己项目中需要有NDK。 因为只有C++代码才能直接调用C++代码,也就是头文件和so库的函数。 其次,就是要想办法把头文件,so库和项目中的NDK关联起来,然后作为一个整体,生成一个jni,供Java层调用。 最后,二者的关联是通过CMake完成的…

软件测试/测试开发丨接口测试Mock实战练习学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27857 一、Rewrite 1.1、Rewrite 原理 1.2、Rewrite 实战 Tools → Rewrite 勾选 Enable Rewrite 点击下方 Add 按钮新建一个重写的规则 在右侧编辑重…

ESP使用webserver实现本地控制

因为使用云服务有时候不可靠&#xff0c;那么离线控制就很重要。本文使用webserver实现本地网页控制。这样不需要再单独开发APP&#xff0c;有浏览器就可以控制。本文所有测试是靠ESP32。8266未测试。使用USE_8266控制。 核心代码如下&#xff1a; html.h #pragma onceconst…

大数据中的分布式文件系统MapReduce的选择题

一 . 选择题 一. 单选题&#xff08;共9题&#xff0c;49.5分&#xff09; (单选题)下列传统并行计算框架,说法错误的是哪一项? A. 刀片服务器、高速网、SAN,价格贵,扩展性差上 B. 共享式(共享内存/共享存储),容错性好 C. 编程难度高 D. 实时、细粒度计算、计算密集型 正确答…

webpack 的 Loader 和 Plugin 的区别,常见的 loader 和 plugin 有哪些?

结论先行&#xff1a; 1、 Loader 和 Plugin 的区别 Loader 也叫做就是“加载器”&#xff0c;因为 webpack 原生只能解析 js 文件&#xff0c;而对于其他类型文件&#xff0c;则需要借助 loader。所以 loader 的作用就是实现对不同格式文件的解析和处理&#xff0c;例如把 E…

使用PCtoLCD2002提取字模

“模式”---“字符模式” LCD显示&#xff0c;汉字使用宋体还是比较好的&#xff0c;16*16是长、宽都是16个像素显示。

Lavarel异步队列的使用

系统为window 启动队列&#xff1a; php artisan queue:listen设置队列类 .env文件需设置&#xff1a;QUEUE_CONNECTIONredis <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Disp…

Spark Core

Spark Core 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 第一章 RDD详解 1.1 为什么需要RDD 分布式计算需要 分区控制shuffle控制数据存储、序列化、发送数据计算API等一系列功能 这些功能&#xff0c;不能简单的通过Python内置的本地集合对象&#xff08;如…

gitlab 设置 分支只读

一&#xff0c;设置master分支只读&#xff0c; 并且只有Maintainers 拥有合并权限。 二&#xff0c;设置成员权限 改为developer 三&#xff0c;邀请成员 点击右上角 Invite Members

冒泡排序算法的四种实现方式:C、C++、Java和Python

下面是冒泡排序算法的四种实现方式&#xff1a;C、C、Java和Python。 C语言实现&#xff1a; #include <stdio.h>void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) {for (int j 0; j < n - i - 1; j) {if (arr[j] > arr[j 1]) {int temp …

AVS3:双向梯度修正BGC

双向梯度修正&#xff08;Bi-directional Gradient Correction&#xff0c;BGC&#xff09;是利用双向参考块间的差值对预测值进行修正的技术。 BGC仅用于双向预测CU&#xff0c;设两个方向得到的单向预测值分别为pred0和pred1&#xff0c;修正前的双向预测值为predBI&#xf…

web —— html

Web —— css基础 1. HTML2. 基本HTML结构3. HTML常用标签3.1 文本相关标签3.2 HTML图像标签3.3 HTML超链接标签3.4 HTML表&#xff0c;单3.4.1 HTML表格3.4.2 HTML表单&#xff0c;输入框&#xff08;多选框&#xff0c;单选框&#xff09;下拉框 3.5 HTML分区标签3.5.1 div标…

LeetCode-94. 二叉树的中序遍历(C++)

目录捏 一、题目描述二、示例与提示三、思路四、代码 一、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 二、示例与提示 示例 1&#xff1a; 输入&#xff1a; root [1,null,2,3] 输出&#xff1a; [1,3,2] 示例 2&#xff1a; 输入&#xf…

大数据毕业设计选题推荐-营业厅营业效能监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

初识Java 17-2 反射

目录 转型前检查 构建例子&#xff1a;生成层次结构 优化Creator&#xff1a;使用类字面量 优化PetCounter&#xff1a;动态验证类型 更通用的递归计数 注册工厂 本笔记参考自&#xff1a; 《On Java 中文版》 转型前检查 当我们使用传统的类型转换&#xff0c;例如&…

Java封装BufferedImage与base64互转方法

一、BufferedImage转base64 /*** BufferedImage 编码转换为 base64* param bufferedImage* return*/private static String BufferedImageToBase64(BufferedImage bufferedImage) {ByteArrayOutputStream bao new ByteArrayOutputStream();//io流try {ImageIO.write(buffered…