pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的。

本章节的代码引入pandas约定为:import pandas as pd,另外import numpy as np也会用到。

官方介绍:pandas - Python Data Analysis Library (pydata.org)

7 缺失数据处理

缺失数据是数据分析中的常见现象。pandas使用浮点值NaN(Not a Number)表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已。python内置的None值也会被当作NA处理。

 1 >>> string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
2 >>> string_data
3 0 aardvark
4 1 artichoke
5 2 NaN
6 3 avocado
7 dtype: object
8 >>> string_data.isnull()
9 0 False
10 1 False
11 2 True
12 3 False
13 dtype: bool
14 >>> string_data[0] = None
15 >>> string_data.isnull()
16 0 True
17 1 False
18 2 True
19 3 False
20 dtype: bool
21 >>>

NA处理方法。

方式 说明
dropna 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度,也就是thresh参数,如设置为2,则至少行(列)有两个非NaN值才保留。
fillna 用指定值或插值方法(如ffill或bfill)填充缺失数据
isnull 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值NA,该对象的类型和源类型一样
notnull isnull的否定式

部分官方说明:

pandas.DataFrame.dropna — pandas 1.3.4 documentation (pydata.org)

pandas.DataFrame.fillna — pandas 1.3.4 documentation (pydata.org)

>>> string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
>>> string_data
0 aardvark
1 artichoke
2 NaN
3 avocado
dtype: object >>> string_data.dropna()
0 aardvark
1 artichoke
3 avocado
dtype: object >>> string_data.fillna(value='haha')
0 aardvark
1 artichoke
2 haha
3 avocado
dtype: object

7.1 滤除缺失数据

过滤掉缺失数据的方法有多种,可通过dropna实现。

 1 >>> from numpy import nan as NA
2 >>> data = pd.Series([1, NA, 3.5, NA, 7])
3 >>> data.dropna()
4 0 1.0
5 2 3.5
6 4 7.0
7 dtype: float64
8 >>> data[data.isnull()]
9 1 NaN
10 3 NaN
11 dtype: float64
12 >>> data[data.notnull()]
13 0 1.0
14 2 3.5
15 4 7.0
16 dtype: float64

对于DataFrame,可能希望丢弃全NA或含有NA的行或列。

 1 >>> data = pd.DataFrame([[1, 1.6, 3], [1, NA, NA], [NA, NA, NA], [NA, 6.5, 3]])
2 >>> data
3 0 1 2
4 0 1.0 1.6 3.0
5 1 1.0 NaN NaN
6 2 NaN NaN NaN
7 3 NaN 6.5 3.0
8 >>>
9 >>> cleaned = data.dropna() #默认丢弃任何含有缺失值的行
10 >>> cleaned
11 0 1 2
12 0 1.0 1.6 3.0
13 >>> data.dropna(how='all') #只丢弃全为NA的行
14 0 1 2
15 0 1.0 1.6 3.0
16 1 1.0 NaN NaN
17 3 NaN 6.5 3.0
18 >>> data[4] = NA
19 >>> data
20 0 1 2 4
21 0 1.0 1.6 3.0 NaN
22 1 1.0 NaN NaN NaN
23 2 NaN NaN NaN NaN
24 3 NaN 6.5 3.0 NaN
25 >>> data.dropna(axis=1, how='all') #丢弃列,且列的所有值为NaN才丢弃
26 0 1 2
27 0 1.0 1.6 3.0
28 1 1.0 NaN NaN
29 2 NaN NaN NaN
30 3 NaN 6.5 3.0
31 >>>

另一个滤除DataFrame行的问题涉及到时间序列数据。如果只想留下一部分观测数据,可以用thresh参数实现。

 1 >>> df = pd.DataFrame(np.random.randn(7, 3))
2 >>> df
3 0 1 2
4 0 0.752301 1.360969 -0.474561
5 1 0.466749 0.563536 1.978575
6 2 0.223606 0.414722 0.094315
7 3 -1.687511 -0.116227 0.442363
8 4 0.705580 -0.131169 -0.868425
9 5 -0.158964 -0.164512 -0.937150
10 6 -0.281537 -1.579942 -0.562886
11 >>> df.loc[:4, 1] = NA
12 >>> df.loc[:2, 2] = NA
13 >>> df
14 0 1 2
15 0 0.752301 NaN NaN
16 1 0.466749 NaN NaN
17 2 0.223606 NaN NaN
18 3 -1.687511 NaN 0.442363
19 4 0.705580 NaN -0.868425
20 5 -0.158964 -0.164512 -0.937150
21 6 -0.281537 -1.579942 -0.562886
>>> df.dropna(thresh=2) #行至少有两个非NaN值才保留
0 1 2
3 -0.845402 NaN -0.037411
4 -0.563560 NaN -0.992985
5 0.227253 -1.649384 -0.754437
6 1.090384 0.980745 0.661543

7.2 填充缺失数据

fillna方法可实现将缺失值替换为一个常数值。

官方文档:pandas.DataFrame.fillna — pandas 1.3.4 documentation (pydata.org)

 1 >>> df
2 0 1 2
3 0 0.752301 NaN NaN
4 1 0.466749 NaN NaN
5 2 0.223606 NaN NaN
6 3 -1.687511 NaN 0.442363
7 4 0.705580 NaN -0.868425
8 5 -0.158964 -0.164512 -0.937150
9 6 -0.281537 -1.579942 -0.562886
10 >>> df.fillna(0)
11 0 1 2
12 0 0.752301 0.000000 0.000000
13 1 0.466749 0.000000 0.000000
14 2 0.223606 0.000000 0.000000
15 3 -1.687511 0.000000 0.442363
16 4 0.705580 0.000000 -0.868425
17 5 -0.158964 -0.164512 -0.937150
18 6 -0.281537 -1.579942 -0.562886
19 >>> df.fillna({1:0.5, 3:-1}) #第1列的NA替换为0.5,第3列的NA替换为-1
20 0 1 2
21 0 0.752301 0.500000 NaN
22 1 0.466749 0.500000 NaN
23 2 0.223606 0.500000 NaN
24 3 -1.687511 0.500000 0.442363
25 4 0.705580 0.500000 -0.868425
26 5 -0.158964 -0.164512 -0.937150
27 6 -0.281537 -1.579942 -0.562886
28 >>>

fillna默认会返回新对象。但也可以对现有对象进行就地修改。

 1 >>> _ = df.fillna(0, inplace=True)
2 >>> df
3 0 1 2
4 0 0.752301 0.000000 0.000000
5 1 0.466749 0.000000 0.000000
6 2 0.223606 0.000000 0.000000
7 3 -1.687511 0.000000 0.442363
8 4 0.705580 0.000000 -0.868425
9 5 -0.158964 -0.164512 -0.937150
10 6 -0.281537 -1.579942 -0.562886
11 >>>

对reindex有效的插值方法也可以用于fillna。

 1 >>> df = pd.DataFrame(np.random.randn(6, 3))
2 >>> df.loc[2:, 1] = NA
3 >>> df.loc[4:, 2] = NA
4 >>> df
5 0 1 2
6 0 -1.433489 0.162951 -0.664600
7 1 0.033722 -0.478252 0.480072
8 2 -0.000977 NaN -1.555649
9 3 -0.947501 NaN 0.089918
10 4 1.360481 NaN NaN
11 5 -0.966030 NaN NaN
12 >>> df.fillna(method='ffill')
13 0 1 2
14 0 -1.433489 0.162951 -0.664600
15 1 0.033722 -0.478252 0.480072
16 2 -0.000977 -0.478252 -1.555649
17 3 -0.947501 -0.478252 0.089918
18 4 1.360481 -0.478252 0.089918
19 5 -0.966030 -0.478252 0.089918
20 >>> df.fillna(method='ffill', limit=2)
21 0 1 2
22 0 -1.433489 0.162951 -0.664600
23 1 0.033722 -0.478252 0.480072
24 2 -0.000977 -0.478252 -1.555649
25 3 -0.947501 -0.478252 0.089918
26 4 1.360481 NaN 0.089918
27 5 -0.966030 NaN 0.089918

下表是fillna的参数参考。

参数 说明
value 用于填充缺失值的标量值或字典对象
method 插值方式,如果函数调用时未指定其他参数的话,默认为“ffill”
axis 带填充的轴,默认为axis=0
limit (对于向前或先后填充)可以连续填充的最大数量

pandas基础--缺失数据处理的更多相关文章

  1. Pandas基础用法-数据处理【全】-转

    完整资料:[数据挖掘入门介绍] (https://github.com/YouChouNoBB/data-mining-introduction) # coding=utf-8 # @author: ...

  2. Pandas | 17 缺失数据处理

    数据丢失(缺失)在现实生活中总是一个问题. 机器学习和数据挖掘等领域由于数据缺失导致的数据质量差,在模型预测的准确性上面临着严重的问题. 在这些领域,缺失值处理是使模型更加准确和有效的重点. 使用重构 ...

  3. Pandas缺失数据处理

    Pandas缺失数据处理 Pandas用np.nan代表缺失数据 reindex() 可以修改 索引,会返回一个数据的副本: df1 = df.reindex(index=dates[0:4], co ...

  4. Python数据分析入门之pandas基础总结

    Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...

  5. 利用Python进行数据分析(9) pandas基础: 汇总统计和计算

    pandas 对象拥有一些常用的数学和统计方法.   例如,sum() 方法,进行列小计:   sum() 方法传入 axis=1 指定为横向汇总,即行小计:   idxmax() 获取最大值对应的索 ...

  6. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  7. Pandas基础学习与Spark Python初探

    摘要:pandas是一个强大的Python数据分析工具包,pandas的两个主要数据结构Series(一维)和DataFrame(二维)处理了金融,统计,社会中的绝大多数典型用例科学,以及许多工程领域 ...

  8. pandas 基础用法

    pandas 是一个基于 Numpy 构建, 强大的数据分析工具包 主要功能 独特的数据结构 DataFrame, Series 集成时间序列功能 提供丰富的数学运算操作 灵活处理缺失数据 Serie ...

  9. 数据可视化基础专题(八):Pandas基础(七) 数据清洗与预处理相关

    1.数据概览 第一步当然是把缺失的数据找出来, Pandas 找缺失数据可以使用 info() 这个方法(这里选用的数据源还是前面一篇文章所使用的 Excel ,小编这里简单的随机删除掉几个数据) i ...

  10. 利用Python进行数据分析(12) pandas基础: 数据合并

    pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...

随机推荐

  1. 力扣162(java&python)-寻找峰值(中等)

    题目: 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可. 你可以假设 nums[ ...

  2. 力扣21(java&python)-合并两个有序链表(简单)

    题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3 ...

  3. 力扣405(java)-数字转换为十六进制(简单)

    题目: 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写.十六进制字符串中不能包含多余的前导零.如果要转 ...

  4. HarmonyOS NEXT应用开发之Axios获取解析网络数据

    介绍 本示例介绍使用第三方库的Axios获取GBK格式的网络数据时,通过util实现GBK转换UTF-8格式.该场景多用于需要转换编码格式的应用. 效果图预览 使用说明 直接进入页面就可获取GBK格式 ...

  5. 深度解读 MongoDB 最全面的增强版本 4.4 新特性

    MongoDB 在今年正式发布了新的 4.4 大版本,这次的发布包含众多的增强 Feature,可以称之为是一个维护性的版本,而且是一个用户期待已久的维护性版本,MongoDB 官方也把这次发布称为「 ...

  6. 基于 EventBridge 构建数据库应用集成

    ​简介:本文重点介绍 EventBridge 的新特性:数据库 Sink 事件目标. 作者:赵海 引言 事件总线 EventBridge 是阿里云提供的一款无服务器事件总线服务,支持将阿里云服务.自定 ...

  7. Spring Cloud Gateway 突发高危漏洞,下一代云原生网关恰逢其时?

    ​简介:Log4j2 的漏洞刚告一段落,Spring 官方在 2022 年 3 月 1 日发布了 Spring Cloud Gateway 的两个 CVE 漏洞:分别为 CVE-2022-22946( ...

  8. Dubbo 跨语言调用神兽:dubbo-go-pixiu

    简介: Pixiu 是基于 Dubbogo 的云原生.高性能.可扩展的微服务 API 网关.作为一款网关产品,Pixiu 帮助用户轻松创建.发布.维护.监控和保护任意规模的 API ,接受和处理成千上 ...

  9. [Gin] 支持 FORM 和 JSON 参数的绑定与验证

    Gin 支持对不同传参方式的参数进行统一绑定并验证,比如如下两种格式: Content-Type: application/x-www-form-urlencoded with a=XX&b= ...

  10. dotnet 谨慎在静态构造函数里使用锁

    在 dotnet 的最佳实践里面,不推荐在静态构造函数里面包含复杂的逻辑,其中也就包含了本文聊的和多线程相关的锁的使用.最佳做法是尽量不要在静态构造函数里面碰到任何和锁以及多线程安全相关的逻辑.本文来 ...