3.5 处理缺失值

本文探讨了Pandas中处理缺失值的方法,包括识别缺失值(None和NaN的区别)、剔除缺失值(dropna)以及填充缺失值(fillna)。重点讲述了None作为Python对象类型缺失值和NaN作为数值类型缺失值的特性和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.5 处理缺失值

涉及的缺失值主要有三种形式: null NaN NA

选择处理缺失值的方法

  • 用覆盖全局的掩码
  • 用特定的标签值表示缺失值

Pandas的缺失值

采用标签值表示缺失值

None:Python对象类型的缺失值

是Python单体对象,在代码中表示缺失值,只能用于Object对象组成的数组中的对象,不能用作任何np或pd数组类型的缺失值。

 

import numpy as np
import pandas as pd

 

vals1 = np.array([1, None, 3, 4])
vals1  # 由于有None,数组对象类型为Python的Object类型
array([1, None, 3, 4], dtype=object)

 

# Python类型运算性能较低,而且包括None对象将导致数值运算错误
vals1.sum()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-57ce7f3f1935> in <module>()
      1 # Python类型运算性能较低,而且包括None对象将导致数值运算错误
----> 2 vals1.sum()

c:\program files\python36-32\lib\site-packages\numpy\core\_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

NaN:数值类型的缺失值

是在任何系统中都兼容的特殊浮点数

 

vals2 = np.array([1, np.nan, 3, 4])
vals2  # 类型会为浮点数
array([ 1., nan,  3.,  4.])

 

vals2.dtype
dtype('float64')

可将NaN看成“数据病毒”:任何数与其运算的结果均为NaN:

 

1 + np.nan
nan

 

0 * np.nan
nan

 

vals2.sum(), vals2.min(), vals2.max()
c:\program files\python36-32\lib\site-packages\numpy\core\_methods.py:29: RuntimeWarning: invalid value encountered in reduce
  return umr_minimum(a, axis, None, out, keepdims)
c:\program files\python36-32\lib\site-packages\numpy\core\_methods.py:26: RuntimeWarning: invalid value encountered in reduce
  return umr_maximum(a, axis, None, out, keepdims)
(nan, nan, nan)

np提供了特殊的累计函数,可以忽略NaN的影响:

 

np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
(8.0, 1.0, 4.0)

Pandas 中 NaN 与 None 的差异

NaN与None在pd中可以等价交换,在适当时候会将两者进行替换:

 

pd.Series([1, np.nan, 2, None])
0    1.0
1    NaN
2    2.0
3    NaN
dtype: float64

 

# pd会将没有标签值的数据类型自动转换为NaN,如整数的np.nan转换为浮点NaN
x = pd.Series(range(2), dtype=int)
x
0    0
1    1
dtype: int32

 

x[0] = None
x
0    NaN
1    1.0
dtype: float64

 

# object类型的None不会自动转化
x = pd.Series(range(2), dtype=object)
x
0    0
1    1
dtype: object

 

x[0] = None
x
0    None
1       1
dtype: object

处理缺失值

几个方法:

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

发现缺失值

方法isnull()和notnull()

 

data = pd.Series([1, np.nan, 'hello', None])
data.isnull()
0    False
1     True
2    False
3     True
dtype: bool

 

data.notnull()
0     True
1    False
2     True
3    False
dtype: bool

 

# 布尔类型掩码数组可以直接作为Series或DF的索引使用
data[data.notnull()]
0        1
2    hello
dtype: object

剔除缺失值

 

data.dropna()
0        1
2    hello
dtype: object

 

# 在DF上使用要设置一些参数
df = pd.DataFrame([[1, np.nan, 2],
                   [2, 3, 5],
                   [np.nan, 4, 6]])
df
 012
01.0NaN2
12.03.05
2NaN4.06

 

# DF只能剔除包含缺失值数据的整行或整列数据
# 默认剔除任何包含缺失值的整行
df.dropna()
 012
12.03.05

 

# 剔除任何包含缺失值的整列,要用参数
df.dropna(axis='columns')
 2
02
15
26

按照行或列中缺失值的数量来剔除缺失值,参数how和thresh

 


 
# 参数how默认为any,即任何缺失值存在则剔除
# 可将how设置为all,即行或列全为缺失值才剔除
df[3] = np.nan
df
 0123
01.0NaN2NaN
12.03.05NaN
2NaN4.06NaN

 

# 现在剔除掉全为缺失值的第三列
df.dropna(axis='columns', how='all')
 012
01.0NaN2
12.03.05
2NaN4.06

 


 
# thresh参数,设置行或列中、非缺失值(即有用数据)的最小数量
df.dropna(axis='rows', thresh=3)
 0123
12.03.05NaN

填充缺失值

fillna方法可以返回填充了缺失值后的数组副本

 


 
data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
data
a    1.0
b    NaN
c    2.0
d    NaN
e    3.0
dtype: float64

 


 
# 用单独的值填充缺失值
data.fillna(0)
a    1.0
b    0.0
c    2.0
d    0.0
e    3.0
dtype: float64

 


 
# 可用缺失值前面的有效值从前往后填充(forwad-fill)
data.fillna(method='ffill')
a    1.0
b    1.0
c    2.0
d    2.0
e    3.0
dtype: float64

 

# 也可用缺失值后面的有效值从后往前填充(back-fill)
data.fillna(method='bfill')
a    1.0
b    2.0
c    2.0
d    3.0
e    3.0
dtype: float64

 

# df用法类似,但要设置坐标轴参数axis
df
 0123
01.0NaN2NaN
12.03.05NaN
2NaN4.06NaN

 

df.fillna(method='ffill', axis=1)  # 按列填充,从第一列向后填充
 0123
01.01.02.02.0
12.03.05.05.0
2NaN4.06.06.0
YOLO系列是基于深度学习的端到端实时目标检测方法。 PyTorch版的YOLOv5轻量而性能高,更加灵活和易用,当前非常流行。 本课程将手把手地教大家使用labelImg标注和使用YOLOv5训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv5使用ultralytics/yolov5,在Ubuntu系统上做项目演示。包括:安装YOLOv5、标注自己的数据集、准备自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型和性能统计。 希望学习在Windows系统上演示的学员,请前往《YOLOv5(PyTorch)实战:训练自己的数据集(Windows)》课程链接:https://edu.csdn.net/course/detail/30923本人推出了有关YOLOv5目标检测的系列课程。请持续关注该系列的其它视频课程,包括:《YOLOv5(PyTorch)目标检测实战:训练自己的数据集》Ubuntu系统 https://edu.csdn.net/course/detail/30793Windows系统 https://edu.csdn.net/course/detail/30923《YOLOv5(PyTorch)目标检测:原理与源码解析》课程链接:https://edu.csdn.net/course/detail/31428《YOLOv5目标检测实战:Flask Web部署》课程链接:https://edu.csdn.net/course/detail/31087《YOLOv5(PyTorch)目标检测实战:TensorRT加速部署》课程链接:https://edu.csdn.net/course/detail/32303《YOLOv5目标检测实战:Jetson Nano部署》课程链接:https://edu.csdn.net/course/detail/32451《YOLOv5+DeepSORT多目标跟踪与计数精讲》课程链接:https://edu.csdn.net/course/detail/32669《YOLOv5实战口罩佩戴检测》课程链接:https://edu.csdn.net/course/detail/32744《YOLOv5实战中国交通标志识别》课程链接:https://edu.csdn.net/course/detail/35209 《YOLOv5实战垃圾分类目标检测》课程链接:https://edu.csdn.net/course/detail/35284  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值