import pandas as pd
import numpy as np
'''5.1 处理缺失值'''
'''对于数值型数据,pandas使用浮点值NaN(Not a Number)来表示缺失值。在pandas中,采用了R语言中的编程管理,将缺失值成为NA,意思是not available。
在统计学应用中,NA数据可以是不存在的数据或者是存在但不可观察的数据(例如在数据收集过程中出现了问题)。
当清洗数据用于分析时,对缺失数据本身进行分析以确定数据收集问题或数据丢失导致的数据偏差通常很重要。'''
string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
'''
0 False
1 False
2 True
3 False
dtype: bool'''
'''Python内建的None值在对象数组中也被当做NA处理:'''
string_data[0] = None
'''
0 True
1 False
2 True
3 False
dtype: bool'''
'''
表:NA处理方法
函数名 描述
dropna 根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许丢失的数据量来确定阈值
fillna 用某些值填充缺失的数据或使用插值方法(如'ffill'或'bfill')
isnull 返回表明哪些值是缺失值的布尔值
notnull isnull的反函数
'''
'''5.1.1 过滤缺失值'''
'''虽然可以使用pandas.isnull和布尔值索引手动地过滤缺失值。但更推荐使用dropna。
在Series上使用dropna,它会返回Series中所有的非空数据及其索引值:'''
from numpy import nan as NA
'''
0 1.0
2 3.5
4 7.0
dtype: float64'''
'''当处理DataFrame对象时,事情会稍微更复杂一点。你可能想要删除全部为NA或包含有NA的行或列。
dropna默认情况下会删除包含缺失值的行:'''
data = pd.DataFrame([[1., 6.6, 3.], [1., NA, NA],
[NA, NA, NA], [NA, 6.5, 3.]])
cleaned = data.dropna()
'''传入how='all'时,将删除所有值均为NA的行:'''
'''
0 1 2
0 1.0 6.6 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0'''
data[4] = NA
'''
0 1 2
0 1.0 6.6 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0'''
'''过滤DataFrame的行的相关方法往往涉及时间序列数据。假设你只想保留包含一定数量的观察值的行。可以用thresh参数来表示:'''
'''
0 1 2
0 0.854705 NaN NaN
1 -1.569215 NaN NaN
2 -0.222426 NaN -1.852322
3 0.005517 NaN 0.951169
4 1.009100 1.075894 1.219964
5 0.794404 0.982503 -0.850304
6 0.521978 -0.277262 1.040425'''
'''
0 1 2
4 1.009100 1.075894 1.219964
5 0.794404 0.982503 -0.850304
6 0.521978 -0.277262 1.040425'''
'''
0 1 2
2 -0.222426 NaN -1.852322
3 0.005517 NaN 0.951169
4 1.009100 1.075894 1.219964
5 0.794404 0.982503 -0.850304
6 0.521978 -0.277262 1.040425'''
'''5.1.2 补全缺失值'''
'''在pandas中,主要使用fillna方法来补全缺失值。调用fillna时,可以使用一个常数来替代缺失值:'''
'''在调用fillna时使用字典,可以为不同列设定不同的填充值:'''
'''fillna返回的是一个新的对象,但也可以修改已经存在的对象:'''
'''用于重建索引的相同的插值方法也可以用于fillna:'''
'''
0 1 2
0 -0.538626 -0.209218 0.373615
1 2.404745 0.216450 -0.618329
2 0.738927 NaN 0.955618
3 -0.117328 NaN 0.174980
4 1.618921 NaN NaN
5 -1.695676 NaN NaN'''
'''
0 1 2
0 -0.538626 -0.209218 0.373615
1 2.404745 0.216450 -0.618329
2 0.738927 0.216450 0.955618
3 -0.117328 0.216450 0.174980
4 1.618921 NaN 0.174980
5 -1.695676 NaN 0.174980'''
'''使用fillna可以完成很多带有一点创造性的工作。例如,可以将Series的平均值或中位数用于填充缺失值:'''
data = pd.Series([1., NA, 3.5, NA, 7])
'''
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 修改被调用的对象,而不是生成一个备份
limit 用于前向或后向填充时最大的填充范围
'''