2020-08-05--Pandas-03--缺失值处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020-08-05--Pandas-03--缺失值处理相关的知识,希望对你有一定的参考价值。
参考技术A 这一章节我们来看下如何使用Pandas处理缺失值。在了解缺失值(也叫控制)如何处理之前,首先要知道的就是什么是缺失值?直观上理解,缺失值表示的是“缺失的数据”。
可以思考一个问题:是什么原因造成的缺失值呢?其实有很多原因,实际生活中可能由于有的数据不全所以导致数据缺失,也有可能由于误操作导致数据缺失,又或者人为地造成数据缺失。
来看下我们的示例吧。
可以看到,用户 Tom 的性别为 None,用户 Mary 的年龄为 NAN,生日为 NaT。在 Pandas 的眼中,这些都属于缺失值,可以使用 isnull() 或 notnull() 方法来操作。
isnull针对DataFrame对象,notnull()针对Series对象
isnull():判断数据中的缺失值,若是确实值,则为True,否则为Flase,返回一个具体数据权威bool值的DataFrame对象
除了简单的可以识别出哪些是缺失值或非缺失值外,最常用的就是过滤掉一些缺失的行。比如,我想过滤掉用户年龄为空的用户,如何操作呢?
notnull():查看每行的该值是否为确实值,若是,则为True,否则为False,返回Series对象。
对于Series对象,相对简单,直接删除对应值为缺失值的行,返回删除后的数据(Series对象)
对于DataFrame对象,相对复杂,因为删除要谨慎操作,参数有:
除了可以丢弃缺失值外,也可以填充缺失值,最常见的是使用 fillna 完成填充。
fillna 这名字一看就是用来填充缺失值的。
填充缺失值时,常见的一种方式是使用一个标量来填充。例如,这里我样有缺失的年龄都填充为 0。
除了可以使用标量来填充之外,还可以使用前一个或后一个有效值来填充。
设置参数 method='pad' 或 method='ffill' 可以使用前一个有效值来填充。
设置参数 method='bfill' 或 method='backfill' 可以使用后一个有效值来填充。
除了通过 fillna 方法来填充缺失值外,还可以通过 interpolate 方法来填充。默认情况下使用线性差值,可以是设置 method 参数来改变方式。
大家有没有想过一个问题:到底什么才是缺失值呢?你可能会奇怪说,前面不是已经说过了么,None、np.nan、NaT 这些都是缺失值。但是我也说过了,这些在 Pandas 的眼中是缺失值,有时候在我们人类的眼中,某些异常值我们也会当做缺失值来处理。
例如,在我们的存储的用户信息中,假定我们限定用户都是青年,出现了年龄为 40 的,我们就可以认为这是一个异常值。再比如,我们都知道性别分为男性(male)和女性(female),在记录用户性别的时候,对于未知的用户性别都记为了 “unknown”,很明显,我们也可以认为“unknown”是缺失值。此外,有的时候会出现空白字符串,这些也可以认为是缺失值。
对于上面的这种情况,我们可以使用 replace 方法来替换缺失值。
对于Series对象
也可以指定一个映射字典。
对于DataFrame来说,可以在replace方法中加上参数inplace=True来做原地操作:可以对DataFrame,也可以针对某一列/行(Series):
可以指定每列要替换的值。设置为原地操作
类似地,我们可以将特定字符串进行替换.
除了可以替换特定的值之外,还可以使用正则表达式来替换,如:将空白字符串替换成空值。
除了我们自己手动丢弃、填充已经替换缺失值之外,我们还可以使用对象来填充。
例如有两个关于用户年龄的 Series,其中一个有缺失值,另一个没有,我们可以将没有的缺失值的 Series 中的元素传给有缺失值的。
对于Series:
对于DataFrame,与Series一样。
pandas(12):数据清洗(缺失值)
一、缺失值
1 缺失值类型
- 空值:在pandas中的空值是:" ",空的字符串,不是缺失值。
- 缺失值:pandas里,如果是DataFrame(数据帧)中,缺失值可以表示为NaN或者NaT(缺失时间)。可以用 Numpy的np.NaN/np.nan直接定义赋值缺失值。
- NaN 是浮点型
- 针对数值为 0 的情况,需要进行实际的分析,回归到原始数据中去,判断该数据为 0 时是否具有实际意义。如果没有就将其作为缺失值做删除处理。
- 针对数据为空值的情况,如果该特征数据缺失情况低于10%,则结合该特征的重要性进行综合判断。如果字段重要性较低,则考虑直接删除,如果字段重要性较高,则进行插值法或者采用简单填充法。
2 缺失值的认定
- 元素级别缺失判定
# 返回true/false bool型DataFrame 或者 Series
df.notna() / df.notnull() # 不是缺失为True,缺失=False
df.isna() / df.isnull() # 是缺失=True,不是缺失=False
df.col.notna() / df.col.isna() df[\'col\'].notnull() / df[\'col\'].isnull()# 支持Series
- 列/行级别缺失判定
# 返回 bool型Series
df.isnull().any() # 列只要有一个缺失=True
df.isna().any(1) # 行只要有一个缺失=True
df.isnull().any().any() # 表级别判断
3 查看缺失情况
df.info() # 直接查看信息
df.isnull().sum() # 每列有多少个缺失值
df.isna().sum(1) # 每行有多少个缺失值
df.isna().sum().sum() # 总共有几个缺失值
df.count() # 统计列的非NaN个数
df.loc[:,df.isna().any()] # 返回有缺失的列(行全要,列只要为True的)
df.loc[df.isna().any(1)] # 返回有缺失的行
df.loc[~(df.isna().any(1))] # 返回没有缺失的行
4 处理方法(1)——缺失值填充
简单填充df.fillna()
df.fillna(value=None, method=None, axis=None,
inplace=False, limit=None, downcast=None, **kwargs)
功能说明:
Fill NA/NaN values using the specified method。
参数说明:
- value:需要用什么值去填充缺失值,可以是scalar, dict(设置每列用不同值填), Series, or DataFrame;
- method:设置填充的方式。pad / ffill:向前填充;backfill / bfill:向后填充;
注意:假如设置method方式,就不需要传入value参数了。还要注意轴向axis的方向。
一般轴向axis都为0(竖向填充),横向填充没啥意义。 - axis:{0 or \'index\'(竖向填充), 1 or \'columns\'(横向填充)};
- inplace:是否修改原df,修改(True)时,返回值为None;
- limit:限定填充个数。默认为None,表示填完。
注意:当指定method、axis、limit,此时limit限定方向填充的个数,不一定缺失值填完;
当传入value、limit时,axis参数不起作用,只能按列向下填充limit个缺失值。 - downcast:向下投射数据类型,一般不用设置,Python自动转换。
df.fillna(0) # 传入标量0,用0填充所有缺失值
# 每列向下填充2个缺省值,axis参数不起作用
df.fillna(value=1,axis=0,limit=2)
# df.fillna(value=0,axis=1,limit=2)
# 传入dict,每列分别用不同的值填充
df.fillna(value={\'A\': 0, \'B\': 1, \'C\': 2, \'D\': 3})
# 用前一个值向前填充缺省值,限制填充个数为1,默认轴向为0(竖向填充)
df.fillna(method=\'ffill\',limit=1)
# 用各自列的均值填充,假如该列可以计算均值的话
df.fillna(df.mean())
# 只对A列且用A列的均值填充缺省值
df.fillna({\'A\': df.mean()[\'A\']})
插值法填充
Series 和 DataFrame 对象都有interpolate()方法,默认情况下,该函数在缺失值处执行线性插值。这个方法是利用数学方法来估计缺失点的值,对于较大的数据非常有用。
(待查补充)
5 处理方法(2)——直接删除
df.dropna(axis=0, how=\'any\', thresh=None, subset=None, inplace=False)
功能说明:
删除含有空值的行或列。
参数说明:
- axis:维度,axis=0表示index行,axis=1表示columns列,默认为0;
- how:"all"表示这一行或列中的元素全部缺失(为nan)才删除这一行或列,"any"表示这一行或列中只要有元素缺失,就删除这一行或列,默认为any;
- thresh:axis中至少有thresh个非缺失值,否则删除;
- subset:[col1,...,coln],根据某n列判断是否有缺失删除行;[row1,...,rown],根据某n行判断是否有缺失删除列。判断时,只要其中有1列/行有缺失值就删除;
- inplace:是否修改原df,修改(True)时,返回值为None。
df.dropna() # 行只要有一个缺失值,就删除该行
df.dropna(axis=1) # 列只要有一个缺失值,就删除该列(谨慎使用!)
df.dropna(how=\'all\',axis=1) # 列都缺失时,才删除该列
df.dropna(thresh=3) # 行至少有3个非缺失值才不删除
df.dropna(axis=1,subset=[3,4]) # 根据index为3和4的行,判断列是否删除
df.dropna(subset=["col_1","col_3"]) # 根据columns为"col_1"和"col_3"的列,判断行是否删除
df.col.dropna() # 指定列的缺失值删除
以上是关于2020-08-05--Pandas-03--缺失值处理的主要内容,如果未能解决你的问题,请参考以下文章