Pandas中缺失值的相关概念与处理方法总结
摘要:本篇总结了Pandas中缺失值的相关概念、原理及处理方法,旨在帮助学习者快速搭建知识框架、更好地理解各类缺失值的含义,因而对于一些具体操作并未详细演示。请配合Datewhale社区的Joyful Pandas教材或其他Pandas教材练习相关函数的具体操作,效果更佳。发现-分析-处理三个步骤。
一、发现缺失值
1、isna和notna方法
2、isnull和notnull方法
两种方法结果相同。
例:
#返回数据框列缺失个数和比例的信息(将DF替换为数据框名即可)
num_missing = np.sum(DF[DF.columns].isnull()).sort_values(ascending=False)
pct_missing = np.mean(DF[DF.columns].isnull()).sort_values(ascending=False)
missing = pd.DataFrame({'num_missing' : num_missing,
'pct_missing' : pct_missing})
missing
找出缺失值之后,可以进行缺失值探索分析,如计算列缺失情况、行缺失情况等并做一些可视化的分析。
如果某行或者列缺失数据过多,包含信息很少,可以直接删除此实例或者特征。否则,就要进行填充或者插补等进一步处理。
二、 Pandas中的三种缺失符号
1、np.nan(最常见),在pandas中显示为NaN
Pandas 里处理缺失值的方式延续了 NumPy 程序包的方式,并没有为浮点数据类型提供内置的 NA 作为缺失值。Pandas选择用标签方法表示缺失值,包括两种 Python 原有的缺失值:浮点数据类型的NaN值,以及Python的None对象。
NaN(全称 Not a Number,不是一个数字),是一种按照 IEEE 浮点数标准设计、在任何系统中都兼容的***特殊浮点数***。在Numpy中可以把 NaN 看作是一个数据类‘’病毒‘’——它会将与它接触过的数据同化,无论和 NaN 进行何种操作(加减乘除等各种聚合函数操作),最终结果都是NaN;而在Python中进行类似聚合运算会自动忽略缺失值带来的影响。
注意:
在所有的表格读取后,无论列是存放什么类型的数据,默认的缺失值全为np.nan类型
(1)numpy中的类型为浮点,由此导致数据集读入时,即使原来是整数的列,只要有缺失值就会变为浮点型。
(2)对于布尔类型的列表,如果是np.nan填充,那么它的值会自动变为True而不是False。
总结:
当数据中存在缺失时,数据类型有以下转变:
整型型转为浮点;
字符型转为object类型(‘O’);
浮点型类型不变。
2、None(仅用于 ‘object’ 数据)
它是一个 Python 单体对象,经常在代码中表示缺失值。由于 None 是一个 Python 对象,所以不能作为任何 NumPy / Pandas 数组类型的缺失值,只能用于 ‘object’ 数组类型(即由 Python 对象构成的数组)。当NumPy / Pandas中数据含有None且不自己指定数据类型时,数据类型会被判定为dtype=object,表示NumPy / Pandas认为由于这个数组是Python 对象构成的,因此将其类型判断为 object。
只有当传入object类型是保持不动,几乎可以认为,除非人工命名None,它基本不会自动出现在Pandas中。
在bool数据中代表False。
3、NaT(仅用于时间序列数据)
NaT是针对时间序列的缺失值,是Pandas的内置类型,可以完全看做时序版本的np.nan,与自己不等,且使用equals是也会被跳过。
在bool数据中代表True。
三、新的Nullable类型与NA符号
1、为什么要引入新的Nullable类型和NA符号?
NA是Pandas在1.0新版本中引入的重大改变,其目的就是为了(在若干版本后)解决之前出现的混乱局面,统一缺失值处理方法
“The goal of pd.NA is provide a “missing” indicator that can be used consistently across data types (instead of np.nan, None or pd.NaT depending on the data type).”——User Guide for Pandas v-1.0
官方鼓励用户使用新的数据类型和缺失类型pd.NA。
引入pd.NA相当于为各种缺失值类型的“统一度量衡”。我们知道,在数据分析和建模的过程中,缺失值往往需要通过填充或者插补等方式处理掉。因而不管缺失值来源于什么类型的数据,其‘缺失’的含义都是相同的,实在没有必要“给一个人起三个外号”。统一"NA"可能是pandas的发展趋势。
熟悉R语言的朋友肯定对NA这个符号不会陌生。在R语言中,缺失值用 NA (表示Not Available)表示,空值用 NULL 表示。NA表示“占了个坑,只是不放东西”,在计算向量长度时会被计算在内;而NULL表示空一物——“压根连坑都没有”,甚至不会被计算长度。
与NA同时被引入Pandas的还有“string”等数据类型,弥补了Pandas缺乏专门字符型数据类型的遗憾。
Pandas中的很多元素都吸收了R语言中的精华并继续发扬,比如其最重要的数据结构DataFrame就来自于R语言。基于python面向对象的特性、pandas统一化的语法结构和全面集成的处理数据和分析功能(大一统),个人认为与R的基本数据处理相比,pandas的易学性、易用性更友好。如果粗暴点理解,可以把Pandas看成建立在Python平台上的R,它和Numpy一起为Python注入数据分析的基因,构成Python数据科学的基石,而后就是在此基础上的“包治百病”。
2、Nullable基本类型
(1)Nullable整形
对于该种类型而言,它与原来标记int上的符号区别在于首字母大写:‘Int’。
当序列使用最新的‘Int’数据类型后,无论将其中的数据替换为np.nan、None、pd.NaT任何一种,其在序列中的符号均被统一为“NA”并且序列数据类型不变,仍为“Int”。
(2)Nullable布尔
对于该种类型而言,作用与上面的类似,数据表现仍为“NA”,数据类型记号为“boolean”。
需要注意的是,含有pd.NA的布尔列表在1.0.2之前的版本作为索引时会报错,这是一个之前的bug,现已经修复。
(3)string类型
之前pandas支持的的基本数据类型中不含字符型数据。当用pandas读进的数据含有字符型数据时,其序列会被标记为“Object”类型,表示数据来自于python对象,这其实带来了一些模糊和不便。
此次推出string数据类型是1.0的一大创新,目的之一就是为了区分开原本含糊不清的object类型。
string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变。
它本质上也属于Nullable类型,因为并不会因为含有缺失而改变类型。
3、NA特性
与Numpy中的NaN一样,具有“病毒属性”,可以进行逻辑计算,但不能用于各种聚合函数(算术运算和比较运算)(返回NA)。
但有两个特例:
pd.NA ** 0 = 1
1 ** pd.NA = 1
4、如何将数据转换为Nullable?-- convert_dtypes方法
例:
pd.read_csv('data.csv').convert_dtypes()
四、处理缺失值
这里给出一张思维导图以抛砖引玉,具体的各种函数用法请查阅图书或直接搜索。
了解更多pandas插值,请戳这里:
https://pandas.pydata.org/pandas-docs/version/1.0.0/reference/api/pandas.DataFrame.interpolate.html#pandas.DataFrame.interpolate
参考文献:
Datawhale社区Joyful Pandas教程;
《Python数据科学》:人民邮电出版社
原文链接:https://blog.csdn.net/weixin_45494886/article/details/106933431