前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用Pandas处理缺失值

用Pandas处理缺失值

作者头像
用户3577892
发布于 2020-06-10 11:35:15
发布于 2020-06-10 11:35:15
3K00
代码可运行
举报
文章被收录于专栏:数据科学CLUB数据科学CLUB
运行总次数:0
代码可运行

处理缺失值选择处理缺失值的方法Pandas的缺失值处理缺失值

Python数据科学手册》读书笔记

处理缺失值

缺失值主要有三种形式:null、 NaN 或 NA。

选择处理缺失值的方法

在数据表或 DataFrame 中有很多识别缺失值的方法。一般情况下可以分为两种:一种方法是通过一个覆盖全局的掩码表示缺失值, 另一种方法是用一个标签值(sentinel value) 表示缺失值。在掩码方法中, 掩码可能是一个与原数组维度相同的完整布尔类型数组, 也可能是用一个比特(0 或 1) 表示有缺失值的局部状态。在标签方法中, 标签值可能是具体的数据(例如用 -9999 表示缺失的整数) , 也可能是些极少出现的形式。另外, 标签值还可能是更全局的值, 比如用 NaN(不是一个数) 表示缺失的浮点数。

Pandas的缺失值

Pandas 用标签方法表示缺失值,包括两种 Python 原有的缺失值:

  • 浮点数据类型的 NaN 值
  • Python的 None 对象。
  1. None:Python对象类型的缺失值

Pandas 可以使用的第一种缺失值标签是 None, 它是一个 Python 单体对象, 经常在代码中表示缺失值。由于 None 是一个 Python 对象, 所以不能作为任何 NumPy / Pandas 数组类型的缺失值,只能用于 'object' 数组类型) :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vals1 = np.array([1, None, 3, 4])
vals1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([1, None, 3, 4], dtype=object)

这里 dtype=object 表示 NumPy 认为由于这个数组是 Python 对象构成的, 因此将其类型判断为 object。虽然这种类型在某些情景中非常有用, 对数据的任何操作最终都会在 Python 层面完成, 但是在进行常见的快速操作时, 这种类型比其他原生类型数组要消耗更多的资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dtype = object
182 ms ± 26 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

dtype = int
7.22 ms ± 720 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

使用 Python 对象构成的数组就意味着如果你对一个包含 None 的数组进行累计操作, 如 sum() 或者 min(), 那么通常会出现类型错误。这就是说, 在 Python 中没有定义整数与 None 之间的加法运算。

  1. NaN:数值类型的缺失值

另一种缺失值的标签是 NaN( 全称 Not a Number, 不是一个数字)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vals2 = np.array([1, np.nan, 3, 4])
vals2.dtype
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dtype('float64')

请注意, NumPy 会为这个数组选择一个原生浮点类型, 这意味着和之前的 object 类型数组不同, 这个数组会被编译成 C 代码从而实现快速操作。 无论和 NaN 进行何种操作, 最终结果都是NaN:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 + np.nan
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nan
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0 * np.nan
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nan

累计操作的结果定义不会抛出异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vals2.sum(), vals2.min(), vals2.max()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(nan, nan, nan)

NumPy 也提供了一些特殊的累计函数, 它们可以忽略缺失值的影响:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(8.0, 1.0, 4.0)

谨记, NaN 是一种特殊的浮点数, 不是整数、 字符串以及其他数据类型。

  1. Pandas中NaN与None的差异

虽然 NaN 与 None 各有各的用处, 但是 Pandas 把它们看成是可以等价交换的, 在适当的时候会将两者进行替换:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pd.Series([1, np.nan, 2, None])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0    1.0
1    NaN
2    2.0
3    NaN
dtype: float64

Pandas 会将没有标签值的数据类型自动转换为 NA。例如, 当我们将整型数组中的一个值设置为 np.nan 时, 这个值就会强制转换成浮点数缺失值 NA。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = pd.Series(range(2), dtype=int)
x
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0    0
1    1
dtype: int32
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x[0] = None
x
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0    NaN
1    1.0
dtype: float64

除了将整型数组的缺失值强制转换为浮点数, Pandas 还会自动将 None 转换为 NaN。

Pandas对不同类型缺失值的转换规则

类型

缺失值转换规则

NA标签值

floating 浮点型

无变化

np.nan

object 对象类型

无变化

None 或 np.nan

integer 整数类型

强制转换为 float64

np.nan

floating 浮点型

无变化

np.nan

boolean 布尔类型

强制转换为 object

None 或 np.nan

需要注意的是, Pandas 中字符串类型的数据通常是用 object 类型存储的。

处理缺失值

Pandas 基本上把 None 和 NaN 看成是可以等价交换的缺失值形式。为了完成这种交换过程, Pandas 提供了一些方法来发现、 剔除、 替换数据结构中的缺失值, 主要包括以下几种。

  • isnull() 创建一个布尔类型的掩码标签缺失值。
  • notnull() 与 isnull() 操作相反。
  • dropna() 返回一个剔除缺失值的数据。
  • fillna() 返回一个填充了缺失值的数据副本。
  1. 发现缺失值

Pandas 数据结构有两种有效的方法可以发现缺失值:isnull() 和 notnull()。每种方法都返回布尔类型的掩码数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = pd.Series([1, np.nan, 'hello', None])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 data.isnull()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0    False
1     True
2    False
3     True
dtype: bool

布尔类型掩码数组可以直接作为 Series或 DataFrame 的索引使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data[data.notnull()] 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0        1
2    hello
dtype: object

在 Series 里使用的 isnull() 和 notnull() 同样适用于DataFrame, 产生的结果同样是布尔类型。

  1. 剔除缺失值

除了前面介绍的掩码方法, 还有两种很好用的缺失值处理方法, 分别是 dropna()(剔除缺失值) 和 fillna()(填充缺失值) 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data.dropna()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0        1
2    hello
dtype: object

而在 DataFrame 上使用它们时需要设置一些参数,例如下面的DataFrame:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.DataFrame([[1, np.nan, 2],
                    [2, 3, 5],
                    [np.nan, 4, 6]])
print(df)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     0    1  2
0  1.0  NaN  2
1  2.0  3.0  5
2  NaN  4.0  6

没法从 DataFrame 中单独剔除一个值, 要么是剔除缺失值所在的整行, 要么是整列。根据实际需求, 有时你需要剔除整行, 有时可能是整列。默认情况下, dropna() 会剔除任何包含缺失值的整行数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(df.dropna())
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     0    1  2
1  2.0  3.0  5

可以设置按不同的坐标轴剔除缺失值, 比如 axis=1(或axis='columns') 会剔除任何包含缺失值的整列数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(df.dropna(axis='columns'))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   2
0  2
1  5
2  6

但是这么做也会把非缺失值一并剔除, 因为可能有时候只需要剔除全部是缺失值的行或列, 或者绝大多数是缺失值的行或列。这些需求可以通过设置 how 或 thresh 参数来满足, 它们可以设置剔除行或列缺失值的数量阈值。

默认设置是 how='any', 也就是说只要有缺失值就剔除整行或整列(通过 axis 设置坐标轴) 。你还可以设置 how='all', 这样就只会剔除全部是缺失值的行或列了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df[3] = np.nan
print(df)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     0    1  2   3
0  1.0  NaN  2 NaN
1  2.0  3.0  5 NaN
2  NaN  4.0  6 NaN
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(df.dropna(axis='columns', how='all'))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     0    1  2
0  1.0  NaN  2
1  2.0  3.0  5
2  NaN  4.0  6

还可以通过 thresh 参数设置行或列中非缺失值的最小数量, 从而实现更加个性化的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(df.dropna(axis='rows', thresh=3))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     0    1  2   3
1  2.0  3.0  5 NaN

第 1 行与第 3 行被剔除了, 因为它们只包含两个非缺失值。

  1. 填充缺失值

有时候可能并不想移除缺失值, 而是想把它们替换成有效的数值。有效的值可能是像 0、 1、 2 那样单独的值, 也可能是经过填充或转换得到的。虽然你可以通过isnull() 方法建立掩码来填充缺失值,Pandas 为此专门提供了一个 fillna() 方法, 它将返回填充了缺失值后的数组副本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
data
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a    1.0
b    NaN
c    2.0
d    NaN
e    3.0
dtype: float64

将用一个单独的值来填充缺失值, 例如用 0:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data.fillna(0)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a    1.0
b    0.0
c    2.0
d    0.0
e    3.0
dtype: float64

可以用缺失值前面的有效值来从前往后填充(forward-fill) :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 从前往后填充
data.fillna(method='ffill')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a    1.0
b    1.0
c    2.0
d    2.0
e    3.0
dtype: float64

也可以用缺失值后面的有效值来从后往前填充(back-fill) :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 从后往前填充
data.fillna(method='bfill')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a    1.0
b    2.0
c    2.0
d    3.0
e    3.0
dtype: float64

DataFrame 的操作方法与 Series 类似, 只是在填充时需要设置坐标轴参数 axis:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(df)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     0    1  2   3
0  1.0  NaN  2 NaN
1  2.0  3.0  5 NaN
2  NaN  4.0  6 NaN
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(df.fillna(method='ffill', axis=1))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     0    1    2    3
0  1.0  1.0  2.0  2.0
1  2.0  3.0  5.0  5.0
2  NaN  4.0  6.0  6.0

需要注意的是, 假如在从前往后填充时, 需要填充的缺失值前面没有值, 那么它就仍然是缺失值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学CLUB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
数据科学 IPython 笔记本 7.7 处理缺失数据
许多教程中的数据与现实世界中的数据之间的差异在于,真实世界的数据很少是干净和同构的。特别是,许多有趣的数据集缺少一些数据。为了使事情变得更复杂,不同的数据源可能以不同的方式标记缺失数据。
ApacheCN_飞龙
2022/06/03
4.4K0
Python数据科学手册(六)【Pandas 处理丢失的数据】
在很多情况下,有些数据并不是完整的,丢失了部分值,这一节将学习如何处理这些丢失的数据。
用户2936342
2018/08/27
2.4K0
Python数据科学手册(六)【Pandas 处理丢失的数据】
pandas中的缺失值处理
在真实的数据中,往往会存在缺失的数据。pandas在设计之初,就考虑了这种缺失值的情况,默认情况下,大部分的计算函数都会自动忽略数据集中的缺失值,同时对于缺失值也提供了一些简单的填充和删除函数,常见的几种缺失值操作技巧如下
生信修炼手册
2020/07/14
3K0
手把手教你用pandas处理缺失值
导读:在进行数据分析和建模的过程中,大量的时间花在数据准备上:加载、清理、转换和重新排列。本文将讨论用于缺失值处理的工具。
IT阅读排行榜
2021/02/22
2.9K0
手把手教你用pandas处理缺失值
Python数据处理从零开始----第三章(pandas)②处理缺失数据
在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值。常见的缺失值处理方式有,过滤、填充。
用户1359560
2018/12/14
1.2K0
pandas系列3_缺失值处理和apply用法
缺失值:df中缺失值为nan或者naT(缺失时间),在S型数据中为none或者nan
皮大大
2021/03/02
1.4K0
pandas 缺失数据处理大全(附代码)
之前一直在分享pandas的一些骚操作:pandas骚操作,根据大家反映还不错,但是很多技巧都混在了一起,没有细致的分类,这样不利于查找,也不成体系。
Python数据科学
2022/03/11
2.5K0
pandas 缺失数据处理大全(附代码)
Pandas数据清洗:缺失值处理
在数据分析的过程中,数据清洗是一个至关重要的步骤。而其中,缺失值的处理又是数据清洗中最常见的问题之一。本文将从基础概念出发,逐步深入探讨Pandas库中处理缺失值的方法,包括常见的问题、报错及其解决方案。
Jimaks
2024/12/19
3610
Pandas高级教程之:处理缺失数据
在数据处理中,Pandas会将无法解析的数据或者缺失的数据使用NaN来表示。虽然所有的数据都有了相应的表示,但是NaN很明显是无法进行数学运算的。
子润先生
2021/06/19
7520
pandas(一)
data= pd.Series([0.25,0.5,0.75,1.0])   默认索引是数字
py3study
2020/01/16
1K0
pandas 处理缺失值[dropna、drop、fillna][通俗易懂]
对于dropna和fillna,dataframe和series都有,在这主要讲datafame的
全栈程序员站长
2022/11/04
2K0
Pandas 2.2 中文官方教程和指南(十六)
numpy.nan适用于 NumPy 数据类型。使用 NumPy 数据类型的缺点是原始数据类型将被强制转换为np.float64或object。
ApacheCN_飞龙
2024/04/25
4670
Pandas 2.2 中文官方教程和指南(十六)
【数据处理包Pandas】数据载入与预处理
对于数据分析而言,数据大部分来源于外部数据,如常用的 CSV 文件、 Excel 文件和数据库文件等。 Pandas 库将外部数据转换为 DataFrame 数据格式,处理完成后再存储到相应的外部文件中。
Francek Chen
2025/01/22
4560
【数据处理包Pandas】数据载入与预处理
Pandas缺失值处理 | 轻松玩转Pandas(3)
# 导入相关库 import numpy as np import pandas as pd 什么是缺失值 在了解缺失值(也叫控制)如何处理之前,首先要知道的就是什么是缺失值?直观上理解,缺失值表示的是“缺失的数据”。 可以思考一个问题:是什么原因造成的缺失值呢?其实有很多原因,实际生活中可能由于有的数据不全所以导致数据缺失,也有可能由于误操作导致数据缺失,又或者人为地造成数据缺失。 来看下我们的示例吧 index = pd.Index(data=["Tom", "Bob", "Mary", "Ja
禹都一只猫olei
2018/09/19
1.6K0
Pandas-DataFrame基础知识点总结
1、DataFrame的创建 DataFrame是一种表格型数据结构,它含有一组有序的列,每列可以是不同的值。DataFrame既有行索引,也有列索引,它可以看作是由Series组成的字典,不过这些Series公用一个索引。 DataFrame的创建有多种方式,不过最重要的还是根据dict进行创建,以及读取csv或者txt文件来创建。这里主要介绍这两种方式。 根据字典创建 data = { 'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], '
石晓文
2018/04/11
4.4K0
Pandas-DataFrame基础知识点总结
小白也能看懂的Pandas实操演示教程(下)
今天主要带大家来实操学习下Pandas,因为篇幅原因,分为了两部分,本篇为下。上篇内容见:小白也能看懂的Pandas实操演示教程(上)。
1480
2019/09/25
2.5K0
小白也能看懂的Pandas实操演示教程(下)
数据分析之Pandas缺失数据处理
3. 缺失数据的运算与分组 3.1. 加号与乘号规则 3.2. groupby方法中的缺失值 4. 填充与剔除 4.1. fillna方法 4.2. dropna方法 5. 插值
Datawhale
2020/07/06
1.7K0
数据分析之Pandas缺失数据处理
【缺失值处理】拉格朗日插值法—随机森林算法填充—sklearn填充(均值/众数/中位数)
缺失值的处理准备数据1 sklearn填充(1)使用均值进行填补(连续型特征)(2)使用中位数、0进行填补(连续型特征)(3)使用众数进行填补(离散型特征)(4)KNN填补
用户7886150
2020/12/30
3.1K0
Pandas基础操作学习笔记
pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。
python与大数据分析
2022/03/11
1K0
Pandas笔记-进阶篇
panda对象拥有一组常用的数学和统计方法,他们大部分都属于简约统计,NA值会自动被排除,除非通过skipna=False禁用
Ewdager
2020/07/14
7140
相关推荐
数据科学 IPython 笔记本 7.7 处理缺失数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档