缺失数据的处理

在数据分析中,缺失数据是经常发生的事,pandas的目标之一就是尽量简单处理缺失数据。
缺失数据在pandas中呈现的方式为:

import pandas as pd
import numpy as np
from pandas import DataFrame, Series
data_nan = pd.Series(['aa', 'gg', 'ee', np.nan])  # pandas使用浮点值NaN来表示缺失数据
data_nan # 缺失数据我们称为哨兵值,可以用isnull或notnull来测出来
# 输出为
0     aa
1     gg
2     ee
3    NaN
dtype: object
data_nan.isnull() # True表示缺失数据
0    False
1    False
2    False
3     True
dtype: bool
data_nan.notnull() # False表示缺失数据
0     True
1     True
2     True
3    False
dtype: bool

# 在python中出现数据为None值在对象数据组中也称为NaN
data_nan[2] = None # data_nan定义的是一组一维数组
data_nan.isnull()
# pd.isnull(data_nan) # 用户API功能处理数据缺失
  • NA数据可能是不存在数据或者是,数据虽然存在但是数据在采集过程中发生了问题。。当进行数据清洗以进行分析时,最好直接对缺失数据进行分析,以判断数据采集的问题或缺失数据可能导致的偏差。

1 . 缺失数据的虑除

  • 对于Series来过滤掉缺失数据
 from numpy import nan as NA
data = pd.Series([1, NA, 3.5, NA, 9])
data.dropna() # dropna()就是drop删除缺失值NA
# 输出为
0    1.0
2    3.5
4    9.0
dtype: float64

data[data.notnull()] # 相当于dropna()方法与上述输出一样
data[data.isnull()] # 获取缺失值
# 输出为
1   NaN
3   NaN
dtype: float64
  • 对于DataFrame来过滤缺失值,丢弃可能是全部是NA或者是含有NA的行和列
data_frame = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],
                           [NA, NA, NA], [NA, 6.5, 3.]], columns=['a', 'b', 'c'])
data_frame
# 输出为
	a	b	c
0	1.0	6.5	3.0
1	1.0	NaN	NaN
2	NaN	NaN	NaN
3	NaN	6.5	3.0

1)drop默认删除含有NA的所有行:

data_frame.dropna()
# 输出为
    a	b	c
0	1.0	6.5	3.0

2)传入how='all’是将那些全行都是NA的行删除:

data_frame.dropna(how='all')
# 输出为
    a	b	c
0	1.0	6.5	3.0
1	1.0	NaN	NaN
3	NaN	6.5	3.0

3) 传入axis=1删除全列都含有NA的列(无论有多少列值都是NA,axis都为1):

data_frame[5] = NA
data_frame[4] = NA
data_frame
# 输出为
    a	b	c	4	5
0	1.0	6.5	3.0	NaN	NaN
1	1.0	NaN	NaN	NaN	NaN
2	NaN	NaN	NaN	NaN	NaN
3	NaN	6.5	3.0	NaN	NaN

data_frame.dropna(how='all', axis=1)
# 输出为
    a	b	c
0	1.0	6.5	3.0
1	1.0	NaN	NaN
2	NaN	NaN	NaN
3	NaN	6.5	3.0

4)想留下一部分来观测数据,用thresh参数来实现:

frame = pd.DataFrame(np.random.randn(7, 3))
frame
# 输出为
    0	        1        	2
0	0.754542	1.934045	0.231346
1	0.091385	-1.271792	-0.118815
2	-0.548498	0.829639	-0.581747
3	0.731459	-0.374219	0.064545
4	0.826738	1.596583	-0.861394
5	0.887876	-0.100982	1.841898
6	-0.554149	-0.639882	-1.391370

frame.iloc[1, [0, 1]] = NA
frame.iloc[3, [1, 2]] = NA
frame.iloc[0, 1] = NA
frame
# 输出为
    0	        1	         2
0	0.754542	NaN	         0.231346
1	NaN	        NaN	        -0.118815
2	-0.548498	0.829639	-0.581747
3	0.731459	NaN	         NaN
4	0.826738	1.596583	-0.861394
5	0.887876	-0.100982	1.841898
6	-0.554149	-0.639882	-1.391370

frame.dropna() #删除含有NA值的行
# 输出为
     0	        1	         2
2	-0.548498	0.829639	-0.581747
4	0.826738	1.596583	-0.861394
5	0.887876	-0.100982	1.841898
6	-0.554149	-0.639882	-1.391370

frame.dropna(thresh=2) # 删除含有NA>2的行
# 输出为
    0	        1	         2
0	0.754542	NaN	         0.231346
2	-0.548498	0.829639	-0.581747
4	0.826738	1.596583	-0.861394
5	0.887876	-0.100982	 1.841898
6	-0.554149	-0.639882	-1.391370
  1. 缺失数据的填充
  • fillna方法来将缺失值替换成常值
frame.fillna(1) # 将上述frame对象中的缺失值NA全部替换为常数1
# 输出为
    0	        1	         2
0	0.754542	1.000000	0.231346
1	1.000000	1.000000	-0.118815
2	-0.548498	0.829639	-0.581747
3	0.731459	1.000000	1.000000
4	0.826738	1.596583	-0.861394
5	0.887876	-0.100982	1.841898
6	-0.554149	-0.639882	-1.391370
  • 通过字典来调用fillna,实现不同列填充不同的值
frame.fillna({1:3., 2:0})
# 输出为

    0	        1	         2
0	0.754542	3.000000	0.231346
1	NaN	        3.000000	-0.118815
2	-0.548498	0.829639	-0.581747
3	0.731459	3.000000	0.000000
4	0.826738	1.596583	-0.861394
5	0.887876	-0.100982	1.841898
6	-0.554149	-0.639882	-1.391370
  • fillna会默认返回新对象,也可以对现有的对象进行修改
 frame1 = frame.fillna(0, inplace=True) #fillna默认会返回新对象
frame
# 输出为

    0	        1	         2
0	0.754542	0.000000	0.231346
1	0.000000	0.000000	-0.118815
2	-0.548498	0.829639	-0.581747
3	0.731459	0.000000	0.000000
4	0.826738	1.596583	-0.861394
5	0.887876	-0.100982	1.841898
6	-0.554149	-0.639882	-1.391370
  • 插值方法也可以用fillna方法
 frame = pd.DataFrame(np.random.randn(6, 3))
frame.iloc[2:, 1] = NA
frame.iloc[4:, 2] = NA
frame
# 输出为
    0	        1	         2
0	-0.916176	1.120807	-1.616737
1	0.599529	0.191739	-1.500778
2	-1.067872	NaN      	-0.605584
3	-0.297000	NaN	        -1.173003
4	0.831406	NaN     	NaN
5	-1.121169	NaN	        NaN

frame.fillna(method='ffill') # method='ffill向下填充
# 输出为
    0	        1	         2
0	-0.916176	1.120807	-1.616737
1	0.599529	0.191739	-1.500778
2	-1.067872	0.191739	-0.605584
3	-0.297000	0.191739	-1.173003
4	0.831406	0.191739	-1.173003
5	-1.121169	0.191739	-1.173003

frame.fillna(method='ffill', limit=1) # 每列(limit=1)限制一个NA值向下填充
# 输出为
    0	        1	         2
0	-0.916176	1.120807	-1.616737
1	0.599529	0.191739	-1.500778
2	-1.067872	0.191739	-0.605584
3	-0.297000	NaN	        -1.173003
4	0.831406	NaN      	-1.173003
5	-1.121169	NaN     	NaN
  • fillna方法还可以实现很多功能,比如可以传入Series或者DataFrame中的count数量、mean、std、min、max对应的数值:
data = pd.Series([1., NA, 3.5, NA, 7])
data.fillna(data.min())
# 输出为
0    1.0
1    1.0
2    3.5
3    1.0
4    7.0
dtype: float64
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐