Pandas缺失值处理

news/2024/10/17 19:30:03/

目录

NaN

加载包含缺失的数据

查看缺失值

通过info函数查看缺失值

通过isnull函数查看缺失值

通过notnull函数查看缺失值

通过isnull().sum()统计空值

缺失值处理

准备数据

dropna删除缺失值

fillna平均值填充缺失值

fillna前后值填充缺失值

interpolate线性插值


NaN

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

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

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

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

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

  • 缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空字符串 

from numpy import NaN,NAN,nanprint(NaN==True)  # False
print(NaN==False)  # False
print(NaN==0)  # False
print(NaN=='')  # False
print(NaN==None)  # False
print(NaN==NaN)  # False
print(NaN==nan)  # False
print(NaN==NAN)  # False
print(nan==NAN)  # False

加载包含缺失的数据

加载数据时可以通过 keep_default_nana_values 指定加载数据时的缺失值

1)加载数据,观察缺失值默认的显示情况

import pandas as pddf = pd.read_csv('../data/c_city_day.csv')
df.head()

2) 使用keep_default_na=False参数加载数据,不显示默认缺失值

df = pd.read_csv('../data/c_city_day.csv', keep_default_na=False)
df.head()

3) 使用na_values参数加载数据,通过该参数指定我们认为的缺失值

# 在这里我们通过na_values参数,指鹿为马
df = pd.read_csv('../data/c_city_day.csv', na_values=["Ahmedabad", "2015-01-01"], keep_default_na=True)
df.head(20)

查看缺失值

通过info函数查看缺失值

import pandas as pddf = pd.read_csv('../data/c_city_day.csv')
df.info()

通过isnull函数查看缺失值

  • pd.isnullpd.isna用法相同

df.head().isnull()
print('===============')
df.head().isna()

通过notnull函数查看缺失值

  • notnull函数和notna函数相同,判断是否存在非缺失值;与isnull函数对应,返回结果正好相反

df.head().notnull()
print('==================')
df.head().notna()

通过isnull().sum()统计空值

print(df['PM2.5'].isnull().sum())
print(df['PM2.5'].notnull().sum())

缺失值处理

  • 删除缺失值:删除缺失值会损失信息,并不推荐删除,当缺失数据占比较高的时候,或可以忽略相关性时,可以尝试使用删除缺失值

  • 填充缺失值:填充缺失值是指用一个估算的值来去替代缺失数

    • 平均值、中位数

    • 前后值填充,数据呈现顺序变化的时候可以使用缺失值前边或后边的值进行填充

  • 线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值

准备数据

#%%
import pandas as pd
df = pd.read_csv('../data/c_city_day.csv')
# 随机获取10条数据
df2 = df.sample(n=10, random_state=5)
df2

dropna删除缺失值

df.dropna(axis = 0,how = 'any' ,inplace = True, subset = ['列名1','列名2',,,], thresh = n)

  • axis=0

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

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

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

  • how='any'

    • 可选参数,默认为any

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

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

  • inplace=False

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

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

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

  • subset接收一个列表

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

  • thresh=n

    • 可选参数

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

1) 删除含有缺失值的行数据

df2.dropna()

2) 删除含有缺失值的列

# 删除含有缺失值的列
df2.dropna(axis=1)

3) 删除指定列中含有缺失值的行数据

# # 删除指定列中含有缺失值的行数据
df2.dropna(how='any', subset=['PM2.5', 'Xylene', 'AQI'])

4) 删除指定列中都含有缺失值的行数据

# 删除指定列中都含有缺失值的行数据
df2.dropna(how='all', subset=['PM2.5', 'Xylene', 'AQI'])

5)  删除非空值小于12的行数据

# 删除含有缺失值的行数据, 剩余非空值个数大于等于12的行数据保留
df2.dropna(thresh=12)

fillna平均值填充缺失值

# 目标: 用平均值填充PM2.5的缺失值
# 1 加载数据
df = pd.read_csv("../data/c_city_day.csv")
# 2 验证缺失值
df.info() # 总: 29531  PM2.5: 24933# 3 求平均值
pm25_mean = df['PM2.5'].mean()
print(pm25_mean) # 67.45057794890272# 4 填充平均值
df['PM2.5'].fillna(pm25_mean, inplace=True)# 5 验证
df.info() # 总: 29531  PM2.5: 29531
print(df['PM2.5'].mean())

fillna前后值填充缺失值

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

1) 使用上一个非空值填充空值

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

    • “ffill” 的全称是 “forward ffill”,即前向填充

# 加载数据
df = pd.read_csv('../data/c_city_day.csv')
s1 = df['Xylene'][54:64]
print(s1)
# 使用前一个非空值填充空值
print('---------------------------')
print(s1.fillna(method='ffill'))

2) 使用下一个非空值填充空值

  • 使用下一个非空值(参数method='bfill')填充整个数据集的空值

    • “bfill” 的全称是 “backward fill”,即反向填充。

# 加载数据
df = pd.read_csv('../data/c_city_day.csv')
s1 = df['Xylene'][54:64]
print(s1)
print('---------------------------')
print(s1.fillna(method='bfill'))

interpolate线性插值

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

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

# 加载数据
df = pd.read_csv('../data/c_city_day.csv')
s1 = df['Xylene'][54:64]
print(s1)
print('---------------------------')
print(s1.interpolate(limit_direction='both'))


http://www.ppmy.cn/news/1539787.html

相关文章

《京东金融APP的鸿蒙之旅系列专题》鸿蒙工程化:Hvigor构建技术

作者:京东科技 杨拓 一、构建工具概述 Hvigor构建工具是一款基于TypeScript实现的构建任务编排工具,专为提升构建和测试应用的效率而设计。它主要提供以下关键功能: 1.任务管理机制:包括任务注册和编排,帮助开发者高效…

2024 kali系统2024版本,可视化界面汉化教程(需要命令行更改),英文版切换为中文版,基于Debian创建的kali虚拟机

我的界面如下所示 1. 安装 locales sudo apt install locales 2. 生成中文语言环境 sudo locale-gen zh_CN.UTF-8 如果你希望安装繁体中文,可以加入: sudo locale-gen zh_TW.UTF-8 3. 修改 /etc/default/locale 文件 确保有以下内容 LANGzh_CN.UT…

文本生成视频技术:艺术与科学的交汇点

在人工智能技术的飞速发展下,文本生成视频(Text-to-Video)技术已经成为现实。这项技术能够根据文本描述生成相应的视频内容,极大地拓展了内容创作的边界。本文将从三个主要方面对文本生成视频技术进行深入探讨:技术能达…

解锁C++多态的魔力:灵活与高效的编码艺术(上)

文章目录 前言🌸一、多态的定义与概念🌻1.1 多态的核心思想:🌻1.2 多态的两种主要形式: 🌸二、多态的使用条件🌻2.1 基类指针或引用2.1.1 为什么需要基类指针或引用 🌻2.2 虚函数&am…

【计算机网络】详解IP协议网段划分路由转发子网掩码网络号

一、IP功能 IP可以实现主机定位和路由选择,提供一种能力,将数据可靠地从A点跨网络送到B点。数据先根据目的IP在局域网之间进行转发,再在局域网内进行内网转发。 二、IP协议报头 4 位版本号(version):指定 IP 协议的版本&#xff…

SpringAI快速上手

一、导入依赖 镜像&#xff08;导入maven依赖&#xff09; <repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>…

【网易云音乐】--源代码分享

最近写了一个网易云音乐的音乐实现部分&#xff0c;是通过JavaScript和jQuery实现的&#xff0c;具体效果大家可以参照下面的视频 源代码分享 - git地址: 网易云音乐源代码 下面将着重讲解一下音乐实现部分 视频有点模糊&#xff0c;不好意思&#xff0c;在b站上添加视频的时候…

应急实战(10):Linux后门帐号

目录 1. Prepare 1.1 部署安全设备 2. Detect 2.1 设备产生告警 3. Contain 4. Eradicate 4.1 删除后门帐号 4.2 加固弱口令帐号 5. Recover 5.1 恢复帐号登录 6. Follow-Up 6.1 修改登录端口 6.2 开启命令记录 1. Prepare 1.1 部署安全设备 部署主机安全产品&#xff1a;牧云H…