21、Pandas缺失数据处理

1、NaN简介

Pandas中的NaN值来自NumPy库,NumPy中缺失值有几种表示形式:NaNNANnan,他们都一样

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_nana_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 行(默认)
howany只要有缺失就会删除,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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容