手把手教你用pandas处理缺失值

Irene181 等级 1061 0 0

手把手教你用pandas处理缺失值

导读:在进行数据分析和建模的过程中,大量的时间花在数据准备上:加载、清理、转换和重新排列。本文将讨论用于缺失值处理的工具。

缺失数据会在很多数据分析应用中出现。pandas的目标之一就是尽可能无痛地处理缺失值。

作者:韦斯·麦金尼(Wes McKinney)

译者:徐敬一

来源:大数据DT(ID:hzdashuju)

手把手教你用pandas处理缺失值

pandas对象的所有描述性统计信息默认情况下是排除缺失值的。

pandas对象中表现缺失值的方式并不完美,但是它对大部分用户来说是有用的。对于数值型数据,pandas使用浮点值NaN(Not a Number来表示缺失值)。我们称NaN为容易检测到的标识值:

In :

string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])  
string_data  

Out:

0      aardvark  
1     artichoke  
2            NaN  
3       avocado  
dtype: object  

In:

string_data.isnull()

Out:

0     False  
1     False  
2      True  
3     False  
dtype: bool

在pandas中,我们采用了R语言中的编程惯例,将缺失值成为NA,意思是not available(不可用)。在统计学应用中,NA数据可以是不存在的数据或者是存在但不可观察的数据(例如在数据收集过程中出现了问题)。当清洗数据用于分析时,对缺失数据本身进行分析以确定数据收集问题或数据丢失导致的数据偏差通常很重要。

Python内建的None值在对象数组中也被当作NA处理:

In:

string_data[0] = None  
string_data.isnull()  

Out:

0      True  
1     False  
2      True  
3     False  
dtype: bool

pandas项目持续改善处理缺失值的内部细节,但是用户API函数,比如pandas. isnull,抽象掉了很多令人厌烦的细节。处理缺失值的相关函数列表如下:

  • dropna: 根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许丢失的数据量来确定阈值

  • fillna: 用某些值填充缺失的数据或使用插值方法(如“ffill”或“bfill”)。

  • isnull: 返回表明哪些值是缺失值的布尔值

  • notnull: isnull的反作用函数

01 过滤缺失值

有多种过滤缺失值的方法。虽然你可以使用pandas.isnull和布尔值索引手动地过滤缺失值,但dropna在过滤缺失值时是非常有用的。在Series上使用dropna,它会返回Series中所有的非空数据及其索引值:

In:

from numpy import nan as NA  
data = pd.Series([1, NA, 3.5, NA, 7])  
data.dropna()  

Out:

0     1.0  
2     3.5  
4     7.0  
dtype: float64

上面的例子与下面的代码是等价的:

In:

data[data.notnull()]

Out:

0     1.0  
2     3.5  
4     7.0  
dtype: float64

当处理DataFrame对象时,事情会稍微更复杂一点。你可能想要删除全部为NA或包含有NA的行或列。dropna默认情况下会删除包含缺失值的行:

In:

data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA]  
                     [NA, NA, NA], [NA, 6.5, 3.]])
cleaned = data.dropna()
data  

Out:

 0     1     2  
0  1.0  6.5  3.0  
1  1.0  NaN  NaN  
2  NaN  NaN  NaN  
3  NaN  6.5  3.0

In:

cleaned

Out:

 0     1     2  
0  1.0  6.5  3.0

传入how='all’时,将删除所有值均为NA的行:

In:

data.dropna(how='all')

Out:

 0    1    2  
0  1.0  6.5  3.0  
1  1.0  NaN  NaN  
3  NaN  6.5  3.0

如果要用同样的方式去删除列,传入参数axis=1:

In:

data[4] = NA
data

Out:

 0    1    2   4  
0  1.0  6.5  3.0 NaN  
1  1.0  NaN  NaN NaN  
2  NaN  NaN  NaN NaN  
3  NaN  6.5  3.0 NaN

In:

data.dropna(axis=1, how='all')

Out:

 0    1    2  
0  1.0  6.5  3.0  
1  1.0  NaN  NaN  
2  NaN  NaN  NaN  
3  NaN  6.5  3.0

过滤DataFrame的行的相关方法往往涉及时间序列数据。假设你只想保留包含一定数量的观察值的行。你可以用thresh参数来表示:

In:

df = pd.DataFrame(np.random.randn(7, 3))  
df.iloc[:4, 1] = NA  
df.iloc[:2, 2] = NA  
df

Out:

 0         1         2  
0 -0.204708       NaN       NaN  
1 -0.555730       NaN       NaN  
2  0.092908       NaN  0.769023  
3  1.246435       NaN -1.296221  
4  0.274992  0.228913  1.352917  
5  0.886429 -2.001637 -0.371843  
6  1.669025 -0.438570 -0.539741

In:

df.dropna()

Out:

 0         1         2  
4 0.274992  0.228913  1.352917  
5 0.886429 -2.001637 -0.371843  
6 1.669025 -0.438570 -0.539741

In:

df.dropna(thresh=2)

Out:

 0         1         2  
2 0.092908       NaN  0.769023  
3 1.246435       NaN -1.296221  
4 0.274992  0.228913  1.352917  
5 0.886429 -2.001637 -0.371843  
6 1.669025 -0.438570 -0.539741

02 补全缺失值

你有时可能需要以多种方式补全“漏洞”,而不是过滤缺失值(也可能丢弃其他数据)。

大多数情况下,主要使用fillna方法来补全缺失值。调用fillna时,可以使用一个常数来替代缺失值:

In:

df.fillna(0)

Out:

 0         1         2  
0 -0.204708  0.000000  0.000000  
1 -0.555730  0.000000  0.000000  
2  0.092908  0.000000  0.769023  
3  1.246435  0.000000 -1.296221  
4  0.274992  0.228913  1.352917  
5  0.886429 -2.001637 -0.371843  
6  1.669025 -0.438570 -0.539741

在调用fillna时使用字典,你可以为不同列设定不同的填充值:

In:

df.fillna({1: 0.5, 2: 0})  

Out:

 0         1         2  
0 -0.204708  0.500000  0.000000  
1 -0.555730  0.500000  0.000000  
2  0.092908  0.500000  0.769023  
3  1.246435  0.500000 -1.296221  
4  0.274992  0.228913  1.352917  
5  0.886429 -2.001637 -0.371843  
6  1.669025 -0.438570 -0.539741

fillna返回的是一个新的对象,但你也可以修改已经存在的对象:

In:

_ = df.fillna(0, inplace=True)
df

Out:

 0         1         2  
0 -0.204708  0.000000  0.000000  
1 -0.555730  0.000000  0.000000  
2  0.092908  0.000000  0.769023  
3  1.246435  0.000000 -1.296221  
4  0.274992  0.228913  1.352917  
5  0.886429 -2.001637 -0.371843  
6  1.669025 -0.438570 -0.539741

用于重建索引的相同的插值方法也可以用于fillna:

In:

df = pd.DataFrame(np.random.randn(6, 3))  
df.iloc[2:, 1] = NA  
df.iloc[4:, 2] = NA  
df

Out:

 0         1         2  
0  0.476985  3.248944 -1.021228  
1 -0.577087  0.124121  0.302614  
2  0.523772       NaN  1.343810  
3 -0.713544       NaN -2.370232  
4 -1.860761       NaN       NaN  
5 -1.265934       NaN       NaN

In:

df.fillna(method='ffill')

Out:

 0         1         2  
0  0.476985  3.248944 -1.021228  
1 -0.577087  0.124121  0.302614  
2  0.523772  0.124121  1.343810  
3 -0.713544  0.124121 -2.370232  
4 -1.860761  0.124121 -2.370232  
5 -1.265934  0.124121 -2.370232

In:

df.fillna(method='ffill', limit=2)

Out:

 0         1         2  
0  0.476985  3.248944 -1.021228  
1 -0.577087  0.124121  0.302614  
2  0.523772  0.124121  1.343810  
3 -0.713544  0.124121 -2.370232  
4 -1.860761       NaN -2.370232  
5 -1.265934       NaN -2.370232

使用fillna你可以完成很多带有一点创造性的工作。例如,你可以将Series的平均值或中位数用于填充缺失值:

In:

data = pd.Series([1., NA, 3.5, NA, 7])
data.fillna(data.mean())  

Out:

0     1.000000  
1     3.833333  
2     3.500000  
3     3.833333  
4     7.000000  
dtype: float64

以下是fillna的函数参数。

  • value: 标量值或字典型对象用于填充缺失值

  • method: 插值方法,如果没有其他参数,默认是'ffill'

  • axis: 需要填充的轴,默认axis=0

  • inplace: 修改被调用的对象,而不是生成一个备份

  • limit: 用于前向或后向填充时最大的填充范围

关于作者:韦斯·麦金尼(Wes McKinney)是流行的Python开源数据分析库pandas的创始人。他是一名活跃的演讲者,也是Python数据社区和Apache软件基金会的Python/C++开源开发者。目前他在纽约从事软件架构师工作。

本文摘编自《利用Python进行数据分析》(原书第2版),经出版方授权发布。

手把手教你用pandas处理缺失值

延伸阅读《利用Python进行数据分析》

点击上图了解及购买

转载请联系微信:DoctorData

推荐语:Python数据分析经典畅销书全新升级,第1版中文版累计销售100000册。针对Python 3.6进行全面修订和更新,涵盖新版的pandas、NumPy、IPython和Jupyter。

订阅大师课,玩转pandas👇

手把手教你用pandas处理缺失值

手把手教你用pandas处理缺失值

划重点👇****

**-----**------**-----**---**** 送书 **-----**--------**-----**-****

内容简介

1、如正文所介绍的那样。

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/dltfxa-nw65oWd_C1smfqw,如有侵权,请联系删除。

收藏
评论区

相关推荐

Pandas案例精进 | 结构化数据非等值范围查找 ③
(https://imghelloworld.osscnbeijing.aliyuncs.com/e6c2856ad5883bc1c88c2f0737ef232e.png) 大家好,我是小五🐶 欢迎来到👉「Pandas案例精进」专栏(https://mp.weixin.qq.com/mp/appmsgalbum?__bizMz
Pandas案例精进 | 结构化数据非等值范围查找 ①
(https://imghelloworld.osscnbeijing.aliyuncs.com/dac5483b3517ff8a0968fc75987d12ad.png) 大家好,我是小五🐶 欢迎来到「Pandas案例精进(https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzU5Nzg5
Pandas案例精进 | 结构化数据非等值范围查找 ②
(https://imghelloworld.osscnbeijing.aliyuncs.com/4971fbce1ecb759123ecc666f3af2c31.png) 大家好,我是小五🐶 欢迎来到「Pandas案例精进」专栏(https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzU5Nzg
Pandas案例精进 | 续集:自动分割汇总表写入到子表
(https://imghelloworld.osscnbeijing.aliyuncs.com/0d046e77f6ee65ce132919966585165a.png) 大家好! 欢迎来到「Pandas案例精进」专栏(https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzU5Nzg5OD
Pandas案例精进 | 自动分割汇总表写入到子表
(https://imghelloworld.osscnbeijing.aliyuncs.com/f5b70d401be96176067dfe8304143ead.png) 大家好! 欢迎来到「Pandas案例精进」专栏 今天分享的是一个之前的案例,里面涉及的方法可能有些过时,但处理思想仍有较高的参考价值。 Pandas案例需求
Pandas统计分析基础(基础篇,新手必看)
Pandas统计分析基础Pandas(Python Data Analysis Library)是基于NumPy的数据分析模块,它提供了大量标准数据模型和高效操作大型数据集所需的工具,可以说Pandas是使得Pyth
Pandas数据载入与预处理(详细的数据Python处理方法)
Pandas数据载入与预处理对于数据分析而言,数据大部分来源于外部数据,如常用的CSV文件、Excel文件和数据库文件等。Pandas库将外部数据转换为DataFrame数据格式,处理完成后再存储到相应的外部文件
Python数据分析实战(2)使用Pandas进行数据分析
一、Pandas的使用 1.Pandas介绍Pandas的主要应用包括: 数据读取 数据集成 透视表 数据聚合与分组运算 分段统计 数据可视化Pandas的使用很灵活,最重要的两个数据类型是DataFrame和Series。对DataFrame最直观的理解是把它当成一个Excel表格文件,如下:索引是从0开始的,也
分享5个高效的pandas函数!
熟练掌握pandas函数都能帮我们在数据分析过程中节省时间。pandas还有很多让人舒适的用法,这次就为大家介绍5个pandas函数!本文来源towardsdatascience,作者Soner Yıldırım,由Python大数据分析编译。1\. explodeexplode用于将一行数据展开成多行。比如说dataframe中某一行其中一个元素包含多个同
手把手教你用pandas处理缺失值
导读:在进行数据分析和建模的过程中,大量的时间花在数据准备上:加载、清理、转换和重新排列。本文将讨论用于缺失值处理的工具。 缺失数据会在很多数据分析应用中出现。pandas的目标之一就是尽可能无痛地处理缺失值。 作者:韦斯·麦金尼(Wes McKinney)译者:徐敬一来源:大数据DT(ID:hzdashuju) pandas对象的所有描述
手把手教你用pandas处理缺失值
导读:在进行数据分析和建模的过程中,大量的时间花在数据准备上:加载、清理、转换和重新排列。本文将讨论用于缺失值处理的工具。 缺失数据会在很多数据分析应用中出现。pandas的目标之一就是尽可能无痛地处理缺失值。 作者:韦斯·麦金尼(Wes McKinney)译者:徐敬一来源:大数据DT(ID:hzdashuju) pandas对象的所有描述
再见,Excel!一行Pandas代码,即可实现漂亮的 “条件格式”!
本文概述Pandas 是数据科学家做数据处理时,使用最多的工具。对比Excel,我们可以发现: Pandas基本可以实现所有的Excel的功能,并且比Excel更方便、简洁,其实很多操作我们在过去的文章中,或多或少都讲述过。但是在数据框上,完成各种 “条件格式” 的设置,帮助我们更加凸显数据,使得数据的展示更加美观,今天还是头一次讲述。上图左表展示的是某班级
天秀!一张图就能彻底搞定Pandas!
大家好,在三月初,我曾给大家分享过一份Matplotlib绘图小抄,详见昨天在面向GitHub编程时,无意发现了Pandas官方竟提供了同款小抄,项目地址如下https://github.com/pandasdev/pandas/blob/master/doc/cheatsheet/PandasCheatSheet.pdf 可以看到这份小抄提供了PPT和P
总结了pandas提取数据的15种方法,统统只需1行代码,真香!
pandas是python数据分析必备工具,它有强大的数据清洗能力,往往能用非常少的代码实现较复杂的数据处理今天,鸟哥总结了pandas筛选数据的15个常用技巧,主要包括5个知识点:1.比较运算:、<、、、<、!2.范围运算:between(left,right)3.字符筛选:str.contains(pattern或字符串,naFalse)4.逻辑运算:&
14个pandas神操作,手把手教你写代码
「数仓宝贝库」,带你学数据!导读: Pandas是Python数据分析的利器,也是各种数据建模的标准工具。本文带大家入门Pandas,将介绍Python语言、Python数据生态和Pandas的一些基本功能。 在Python语言应用生态中,数据科学领域近年来十分热门。作为数据科学中一个非常基础的库,Pandas受到了广泛关注。Pandas可以将现实中来