首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas 之 缺失值的处理

Pandas 之 缺失值的处理

作者头像
DataScience
发布2019-12-31 16:57:40
1.4K0
发布2019-12-31 16:57:40
举报
文章被收录于专栏:A2DataA2Data

什么是缺失值? (控制) 那么,到底什么是缺失值呢? 直观上理解,缺失值表示的是‘缺失的数据’ 缺失值 导致的原因是什么呢? 1) 可能是由于数据不全所以导致数据缺失 2) 可能是误操作导致数据缺失 3) 亦或者人为地造成数据缺失。 什么是缺失值? (控制) 那么,到底什么是缺失值呢? 直观上理解,缺失值表示的是‘缺失的数据’ 缺失值 导致的原因是什么呢? 1) 可能是由于数据不全所以导致数据缺失 2) 可能是误操作导致数据缺失 3) 亦或者人为地造成数据缺失。 #导入相关库 import numpy as np import pandas as pd index =pd.Index(data=["A","B","C","D","风"],name="name") data = { "age":[18,10,np.nan,22,25], "city":["Beijing","Shanghai","guangzhou","shenzhen","XiAn"], "Sex":[None,"male","feamle",np.nan,"feamle"], "birth":["1990-10-10",None,np.nan,"1998-01-01","2020-10-20"] } user_info = pd.DataFrame(data=data,index=index) user_info age city Sex birth name A 18.0 Beijing None 1990-10-10 B 10.0 Shanghai male None C NaN guangzhou feamle NaN D 22.0 shenzhen NaN 1998-01-01 风 25.0 XiAn feamle 2020-10-20 #将出生日期转化为时间戳 user_info["birth"] = pd.to_datetime(user_info.birth) user_info age city Sex birth name A 18.0 Beijing None 1990-10-10 B 10.0 Shanghai male NaT C NaN guangzhou feamle NaT D 22.0 shenzhen NaN 1998-01-01 风 25.0 XiAn feamle 2020-10-20 # 可以看到用户 D 的性别为 NAN, # 再pandas 眼中 这些都属于 缺失值 # 可以使用 isnull() 或者 notnull()方法来操作。 user_info.isnull() age city Sex birth name A False False True False B False False False True C True False False True D False False True False 风 False False False False user_info.notnull() age city Sex birth name A True True False True B True True True False C False True True False D True True False True 风 True True True True #假如我想过滤掉 性别为空的 用户呢 user_info user_info[user_info.Sex.notnull()] age city Sex birth name B 10.0 Shanghai male NaT C NaN guangzhou feamle NaT 风 25.0 XiAn feamle 2020-10-20 # 缺失值处理方案之-丢弃缺失值 #dropna 方法 user_info.Sex.dropna() name B male C feamle 风 feamle Name: Sex, dtype: object Seriese 使用dropna比较简单,对于DataFrame来说,可以设置更多的参数。 axis 参数用于控制行或者列,跟其他不一样的是,axis=0(默认) 表示操作行,axis=1 表示操作列。 how 参数可选的值 为any(默认)或者all。 any表示一行/列有任意元素为空时即丢弃,all 一行/列所有值都为空时才丢弃。 subset 参数表示删除时只考虑的索引或列名。 thresh参数的类型为整数,它的作用是,比如 thresh =3 ,会在一行/列至少有3 个非空值时将其保留。 #一行数据只要有一个字段存在空值 即删除 user_info.dropna(axis=0,how="any") age city Sex birth name 风 25.0 XiAn feamle 2020-10-20 #一行数据,所有的字段都为空值 才删除 user_info.dropna(axis=0,how="all") age city Sex birth name A 18.0 Beijing None 1990-10-10 B 10.0 Shanghai male NaT C NaN guangzhou feamle NaT D 22.0 shenzhen NaN 1998-01-01 风 25.0 XiAn feamle 2020-10-20 #一行数据中只要age 或者 Sex 存在空值, 即删除 user_info.dropna(axis=0,how="any",subset=["Sex","age"]) age city Sex birth name B 10.0 Shanghai male NaT 风 25.0 XiAn feamle 2020-10-20 #缺失值处理之 填充缺失值 # fillna 方法来完成 #将年龄 缺失的 填充为0 user_info.age.fillna(0) name A 18.0 B 10.0 C 0.0 D 22.0 风 25.0 Name: age, dtype: float64 # method 可以使用前一个 或者后一个来填充 # ffill & pad 前一个有效值来填充 user_info.age.fillna(method='ffill') name A 18.0 B 10.0 C 10.0 D 22.0 风 25.0 Name: age, dtype: float64 #后一个有效值来填充 bfill & backfill user_info.age.fillna(method='backfill') name A 18.0 B 10.0 C 22.0 D 22.0 风 25.0 Name: age, dtype: float64 缺失值填充方式之 interpolate 方法 # 默认情况下 使用 线性差值 # 可以设置 method 参数来改变方式 user_info.age.interpolate() name A 18.0 B 10.0 C 16.0 D 22.0 风 25.0 Name: age, dtype: float64 缺失值处理之 替换 问题: 到底什么才是缺失值呢? eg: None np.nan NaT 。。。 而这些只是在pandas 眼中是缺失值 那么在人的眼中 ,某些异常值也会被当做 缺失值来处理。 例如: 在一批年轻的用户中,出现了一个50岁的老头,我们就可以将它定义异常值。 另如: 性别的存储中, 一般来说,男 & 女 But,在记录用户性别的时候,对于未知用户都记为“unknown” 那么,很明显,我们可以认为‘unknown’是缺失值。 综上各种案例 答案来了- - 我们可以使用 replace 方法 来替换 缺失值。 user_info age city Sex birth name A 18.0 Beijing None 1990-10-10 B 10.0 Shanghai male NaT C NaN guangzhou feamle NaT D 22.0 shenzhen NaN 1998-01-01 风 25.0 XiAn feamle 2020-10-20 #18岁以下 未成年 user_info.age.replace(10,np.nan) name A 18.0 B NaN C NaN D 22.0 风 25.0 Name: age, dtype: float64 #指定一个映射字典 user_info.age.replace({10:np.nan}) name A 18.0 B NaN C NaN D 22.0 风 25.0 Name: age, dtype: float64 # datafreame 可以指定每列要替换的值 user_info.replace({"age":10,"birth":pd.Timestamp("1998-01-01")},np.nan) age city Sex birth name A 18.0 Beijing None 1990-10-10 B NaN Shanghai male NaT C NaN guangzhou feamle NaT D 22.0 shenzhen NaN NaT 风 25.0 XiAn feamle 2020-10-20 #类似地,我们可以将特定的字符串进行替换, 如age 中的NaN 替换 user_info.age.replace("NaN",np.nan) name A 18.0 B 10.0 C NaN D 22.0 风 25.0 Name: age, dtype: float64 #除了替换特定的值之外,可以是使用正则表达式来替换 # 例如将 空白字符串 换成 空值 user_info["AA"] = " " user_info age city Sex birth AA name A 18.0 Beijing None 1990-10-10 B 10.0 Shanghai male NaT C NaN guangzhou feamle NaT D 22.0 shenzhen NaN 1998-01-01 风 25.0 XiAn feamle 2020-10-20 user_info.AA.replace(r'\s+',np.nan, regex=True) name A NaN B NaN C NaN D NaN 风 NaN Name: AA, dtype: float64 #缺失值填充之-- 使用其他对象填充 #除了我们自己手动丢弃、填充已经替换缺失值之外,我们还可以使用其它对象来填充。 age_new = user_info.age.copy() age_new.fillna(10,inplace=True) age_new # 将age 其中的缺失值,另一个没,将没有缺失的值 Series 中的元素传给有缺失值的。 前后 同上(详情见上述填充值详细) 一样控制。 name A 18.0 B 10.0 C 10.0 D 22.0 风 25.0 Name: age, dtype: float64 user_info.age.combine_first(age_new) name A 18.0 B 10.0 C 10.0 D 22.0 风 25.0 Name: age, dtype: float64 可以看到 用户年龄缺失值都用age_new 这个Series填充了。

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

本文分享自 DataScience 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档