1、NaN简介
Pandas中的NaN值来自NumPy库,NumPy中缺失值有几种表示形式:NaN,NAN,nan,他们都一样
1.1、查看NaN,NAN,nan
1、NaN的值
缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空串,
from numpy import NaN, NAN, nan
print(NaN == True) # False
print(NaN == False) # False
print(NaN == 0) # False
print(NaN == '.') # False
2、两个NaN也不相等
print(NaN == NAN) # False
print(NaN == nan) # False
print(NAN == nan) # False
3、isnull/isna方法,用于测试某个值是否为缺失值,notnull/notna方法也可以用于判断某个值是否为缺失值
import pandas as pd
print(pd.isnull(NAN)) # True
print(pd.isnull(nan)) # True
print(pd.isnull(NaN)) # True
print(pd.notnull(NaN)) # False
print(pd.notnull(40)) # True
2、加载缺失
1、加载数据时可以通过keep_default_na 与 na_values 指定加载数据时的缺失值
pd.read_csv('data/survey_visited.csv')
2、加载数据,不包含默认缺失值
pd.read_csv('data/survey_visited.csv',keep_default_na = False)
3、加载数据,手动指定缺失值
pd.read_csv('data/survey_visited.csv',na_values=[""],keep_default_na = False)
3、处理缺失值
3.1、查看数据
train=pd.read_csv('data/titanic_train.csv')
test=pd.read_csv('data/titanic_test.csv')
train.shape # (891, 12)
train.head(1)
1、查看train缺失数据可视化
pip (pip3) install missingno
import missingno as msno
msno.bar(train)

2、通过计算缺失值间相关性判断缺失原因
msno.heatmap(train)

训练集和测试集的缺失值比例基本相似
3.2、删除缺失值
1、按行删除:删除包含缺失值的记录(整个行)
subset: 默认有缺失值的行,指定年龄有缺失的列才被删除 subset=['Age']
inplace: 是否修改原始数据
axis:按行/列删除 axis=0 行(默认)
how:any只要有缺失就会删除,all全部缺失才会删除
train_1 = train.copy() # 复制一份数据
train_1.dropna(subset=['Cabin'],how='any',inplace=True)
train_1['Cabin'].isnull().sum()
train_1.shape
2、按列删除(把缺失数据列直接删除)
当一列包含了很多缺失值的时候(比如超过80%),可以将该列删除,但最好不要删除数据
# Cabin的列被删除
train_1.drop(['Cabin'],axis = 1).head()
3.3、填充缺失值
填充缺失值是指用一个估算的值来去替代缺失数
1、非时间序列数据
fillna有缺失的部分,使用常量来替换(默认值)
train_constant = train.copy()
train_constant.fillna(0,inplace = True)
train_constant.isnull().sum()
train_constant[train_constant['Cabin']==0].shape
使用统计量替换(缺失值所处列的平均值、中位数、众数)
train_mean = train.copy()
train_mean['Age'].fillna(train_mean['Age'].mean(),inplace = True)
train_mean.isnull().sum()
2、时间序列数据介绍
parse_dates: 解析日期,指定日期列,直接解析成 date的时间类型
city_day = pd.read_csv('data/city_day.csv',parse_dates=['Date'],index_col='Date')
ffill:用时间序列中空值的上一个非空值填充
bfill:用时间序列中空值的下一个非空值填充
#NaN值的后一个非空值是209,可以看到所有的NaN都被填充为209
city_day.fillna(method='bfill',inplace=True)
interpolate:线性插值方法
limit_direction:两边都考虑
city_day1.interpolate(limit_direction="both",inplace=True)