学习数据处理基础知识(缺失值处理)pandas

Posted Aric Zeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习数据处理基础知识(缺失值处理)pandas相关的知识,希望对你有一定的参考价值。

缺失数据(missing data)大部分数据分析应用中非常常见。pd设计目标之一就是让缺失数据的处理任务尽量轻松。

pd 使用浮点值NaN(Not a Number) 表示浮点和非浮点数组中的缺失数据。是一个被检测出来的标识

import pandas as pd
import numpy as np
string_data = pd.Series([aardvark, artichoke, np.nan, avocado])
string_data
string_data.isnull()

#内置的None值也会被当作Na处理
string_data[0] = None
string_data.isnull()

Out[180]:
0     True
1    False
2     True
3    False
dtype: bool

Na处理方法

"""
=====Na处理方法=========
dropna  根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阀值调节对缺失值的容忍度
fillna  用指定值或插值方法填充缺失数据
isnull  返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值,该对象的类型与源类型一样
notnull  isnull的否定式
"""

1、 滤除缺失数据

#dropna 返回一个仅含非空数据和索引值的Series

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

Out[183]:
0    1.0
2    3.5
4    7.0
dtype: float64

#也可以通过布尔型索引达到这个目标
data[data.notnull()]
#对于dataFrame,dropna默认丢弃任何含有缺失值的行
data = pd.DataFrame([[1., 6.5, 3], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3]])
cleaned = data.dropna()
data
Out[187]:
     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
cleaned
Out[188]:
     0    1    2
0  1.0  6.5  3.0
data.dropna(how = ‘all‘)
Out[189]: 0 1 2 0 1.0 6.5 3.0 1 1.0 NaN NaN 3 NaN 6.5 3.0

只用这种方式丢弃列,只需传入axis =1 即可

#只用这种方式丢弃列,只需传入axis =1 即可
data[4] = NA
data
data.dropna(axis = 1, how = all)

另一个滤除DF的行问题涉及时间序列数据,假设你只想留下一部分预测数据,可以用thresh参数实现些目的

df = pd.DataFrame(np.random.randn(7, 3))
df
df.ix[:4, 1] = NA; df.ix[:2, 2] = NA
Out[195]:
          0         1         2
0 -1.391379       NaN       NaN
1  0.283693       NaN       NaN
2 -1.256739       NaN       NaN
3 -0.279809       NaN  0.511898
4 -2.942845       NaN -0.938693
5  1.478454 -1.869872 -1.815566
6 -1.001717 -0.074136 -1.132250
df.dropna(thresh
= 3)
Out[196]:
          0         1         2
5  1.478454 -1.869872 -1.815566
6 -1.001717 -0.074136 -1.132250

2、 填充缺失 数据

fillna方法是最主要的函数,通过一个常数调用fillna就会将缺失值替换为那个常数值



df.fillna(0) Out[
197]: 0 1 2 0 -1.391379 0.000000 0.000000 1 0.283693 0.000000 0.000000 2 -1.256739 0.000000 0.000000 3 -0.279809 0.000000 0.511898 4 -2.942845 0.000000 -0.938693 5 1.478454 -1.869872 -1.815566 6 -1.001717 -0.074136 -1.132250
#若是通过一个字典调用fillna, 就可以实现对不同的列填充不同的值
df.fillna({1: 0.5, 3: -1})
Out[198]: 
          0         1         2
0 -1.391379  0.500000       NaN
1  0.283693  0.500000       NaN
2 -1.256739  0.500000       NaN
3 -0.279809  0.500000  0.511898
4 -2.942845  0.500000 -0.938693
5  1.478454 -1.869872 -1.815566
6 -1.001717 -0.074136 -1.132250
#fillna默认会返回新对象,但也可以对现有对象进行就地修改
#总是返回被填充对象的引用
_ = df.fillna(0, inplace = True) df
Out[200]: 
          0         1         2
0 -1.391379  0.000000  0.000000
1  0.283693  0.000000  0.000000
2 -1.256739  0.000000  0.000000
3 -0.279809  0.000000  0.511898
4 -2.942845  0.000000 -0.938693
5  1.478454 -1.869872 -1.815566
6 -1.001717 -0.074136 -1.132250

对reindex有效的那些插值方法也可用于fillna

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

Out[204]:
          0         1         2
0  1.498980 -0.048566  1.406554
1  1.143778 -0.370818  1.333525
2 -2.557671       NaN  0.419188
3 -0.648393       NaN -0.159103
4  0.794345       NaN       NaN
5  1.814522       NaN       NaN
#ffill 向前填充值
#bfill 向后填充值
df.fillna(method = ffill)

Out[205]:
          0         1         2
0  1.498980 -0.048566  1.406554
1  1.143778 -0.370818  1.333525
2 -2.557671 -0.370818  0.419188
3 -0.648393 -0.370818 -0.159103
4  0.794345 -0.370818 -0.159103
5  1.814522 -0.370818 -0.159103
#可填充最大标识量为2 df.fillna(method = ffill, limit =2)

Out[206]:
          0         1         2
0  1.498980 -0.048566  1.406554
1  1.143778 -0.370818  1.333525
2 -2.557671 -0.370818  0.419188
3 -0.648393 -0.370818 -0.159103
4  0.794345       NaN -0.159103
5  1.814522       NaN -0.159103

 

#均值或中位数填充
data = pd.Series([1., NA, 3.5, NA, 7])
data
data.fillna(data.mean())

Out[215]:
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  修改调用者对象而不产生副本,True为就地修改
limit   (对于前向和后台填充)可以连续填充的最大数量
"""

 

以上是关于学习数据处理基础知识(缺失值处理)pandas的主要内容,如果未能解决你的问题,请参考以下文章

pandas数据缺失处理

Pandas | 17 缺失数据处理

数据缺失处理(pandas)

机器学习--数据预处理

机器学习基础:缺失值的处理技巧(附Python代码)

2020-08-05--Pandas-03--缺失值处理