专栏首页A2DataPandas 之 缺失值的处理

Pandas 之 缺失值的处理

什么是缺失值? (控制) 那么,到底什么是缺失值呢? 直观上理解,缺失值表示的是‘缺失的数据’ 缺失值 导致的原因是什么呢? 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填充了。

本文分享自微信公众号 - DataScience(gh_b52493d7af49),作者:Jack 风

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HDFS ACL权限管理 初解

    Hadoop中的ACL与Linux中的ACL机制基本相同,都是用于为文件系统提供更精细化的权限控制。

    A2Data
  • Pandas_数据结构

    A2Data
  • Pandas-常用基本功能

    A2Data
  • 【每日一提】问题 1418: 大神的探险 之 满载而归

    题目描述 cqy终于躲过了各种陷阱,打败了各种野怪,找到了宝藏。可是,墓穴里的氧气已经消耗殆尽,原路返回是不可能了。在这危急关头,cqy竟然奇迹般地发现一条密...

    编程范 源代码公司
  • 【GPLT】L1-045 宇宙无敌大招呼

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 注意:C++中double的表示是有误差的

    注意:C++中double的表示是有误差的,直接通过下面的例子看一下 1 #include<iostream> 2 using namespace std;...

    用户1215536
  • 微信小程序开发系列一:微信小程序的申请和开发环境的搭建

    点击按钮“前往注册”。注意我们需要使用一个没有注册过微信小程序或者微信公众号的邮箱。我用的是网易邮箱。注册之后,邮箱会收到一封激活邮件。

    Jerry Wang
  • 成为优秀Java开发者的10个方法

    Java开发人员必须深刻理解面向对象编程。如果没有面向对象编程的坚实基础,就无法感受到像Java这样的面向对象编程语言的美感。如果你不太了解现象对象编程是什么,...

    lyb-geek
  • 03-基本运算

    运算符可以分为:算术运算符、比较运算符和逻辑运算符。优先级是:算术运算符>比较运算符>逻辑运算符。不过呢,开始没背下来优先级,最好使用括号。这样不用背,也增加了...

    凯茜的老爸
  • Springboot+shiro基于url身份认证和授权认证

    三个核心组件:Subject, SecurityManager 和 Realms.

    bigsai

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动