python数据分析(五)—数据清洗1
在数据分析中,缺失数据是经常发生的事,pandas的目标之一就是尽量简单处理缺失数据。1.缺失数据的虑除。
·
缺失数据的处理
在数据分析中,缺失数据是经常发生的事,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
- 缺失数据的填充
- 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
更多推荐
所有评论(0)