目录:
- 学习目标
- 空值和缺失值
- 查看缺失值
- 加载数据并通过info函数初步查看缺失值情况
- df.isnull().sum()空值数量统计
- Missingno库对缺失值的情况进行可视化探查
- 安装missingno库
- missingno.bar(df)缺失值数量可视化
- missingno.matrix(df)缺失值位置的可视化
- missingno.heatmap(df)缺失值之间相关性可视化
- 缺失值的处理
- dropna删除缺失值
- fillna固定值填充缺失值
- fillna前后值填充缺失值
- interpolate线性插值
- 总结:
- 项目地址
1.学习目标
-
知道空值和缺失值的区别以及缺失值的影响
-
知道如何查看数据集缺失值情况的方法
-
知道缺失值处理的办法
2.空值和缺失值
-
在Pandas中空值和缺失值是有区别的,缺失值包含了空值
-
好多数据集都含缺失数据。缺失数据有多重表现形式
-
数据库中,缺失数据表示为
NULL
-
在某些编程语言中用
NA
或None
表示 -
缺失值也可能是空字符串
''
或数值0
-
在Pandas中使用
NaN
表示缺失值- Pandas中的NaN值来自Numpy库,Numpy中缺失值有几种表示形式:NaN,NAN,nan,他们都一样
-
除了Pandas中的空值以外,上述类型的缺失值都可以使用replace函数统一替换为
NaN
-
-
NaN
表示空值-
NaN
是pandas中的特殊的数据结构,来源于numpy包的特殊数据结构 -
NaN
毫无意义-
NaN不等于0
-
也不等于空字符串
-
更不等于布尔值False
-
并且两个NaN也不相等
-
-
bash
# 使JupyterNotebook单个cell可以有多个输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'
from numpy import NaN,NAN,nan
# 缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空字符串
NaN==True
NaN==False
NaN==0
NaN==''
NaN==None
# 两个NaN也不相等
NaN==NaN
NaN==nan
NaN==NAN
nan==NAN
3.查看缺失值
加载数据并通过info函数初步查看缺失值情况
- 加载印度城市空气质量数据集,并初步查探缺失值
bash
import pandas as pd
# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
print(city_day)
print(city_day.info())
- isnull函数和notnull函数判断是否存在空值
bash
import pandas as pd
# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 空值返回True
print(city_day.isnull())
print(city_day['PM2.5'].isnull())
- isnull的返回值中存在True,`any()`就返回True
bash
import pandas as pd
# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
print(city_day.isnull().any())
print(city_day.isnull().any().any())
print(city_day['PM2.5'].isnull().any())
- notnull函数和notna函数相同,判断是否存在非空值;与isnull函数对应,返回结果正好相反
bash
import pandas as pd
# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 空值返回False
print(city_day.notna())
print(city_day['PM2.5'].notna())
df.isnull().sum()空值数量统计
bash
import pandas as pd
# 加载印度城市空气质量数据集
# index_col='Date' 指定Date列作为索引列
# parse_dates=True 将Date列中的数据解析为时间类型
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 空值数量统计
print(city_day.isnull().sum())
print(city_day['PM2.5'].isnull().sum())
# 非空值数量统计
print(city_day.notnull().sum())
print(city_day['PM2.5'].notnull().sum())
Missingno库对缺失值的情况进行可视化探查
- 可以使用第三方库Missingno来对缺失值进行可视化
安装missingno库
- pip install missingno
missingno.bar(df)缺失值数量可视化
bash
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 查看缺失值数量
city_day.isnull().sum()
# 查看非缺失值数量
city_day.notna().sum()
# 可视化查看缺失值数量情况
msno.bar(city_day)
plt.show()
missingno.matrix(df)缺失值位置的可视化
- `missingno.matrix(df)` 可以快速直观的查看缺失值的分布情况
bash
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
msno.matrix(city_day)
plt.show()
# 对数据集进行随机取样后再查看数据缺失情况
msno.matrix(city_day.sample(100))
plt.show()
missingno.heatmap(df)缺失值之间相关性可视化
bash
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
msno.heatmap(city_day)
plt.show()
**返回结果如下**:相关性取值 0 不相关,1强相关,-1强负相关
4.缺失值的处理
- 缺失值的处理方法有以下几种方式:
- 删除缺失值:删除缺失值会损失信息,并不推荐删除,当缺失数据占比较低的时,或可以忽略相关性时,可以尝试使用删除缺失值
- 填充缺失值:填充缺失值是指用一个估算的值来去替代缺失数
- 平均值、中位数
- 前后值填充,数据呈现顺序变化的时候可以使用缺失值前边或后边的值进行填充
- 线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值
dropna删除缺失值
使用`dropna`函数来删除空值,具体用法如下
bash
# 函数用法
df.dropna(
axis=0,
how='any',
inplace=True,
subset=['列名',...],
thresh=10
)
df.drop() # 按列删除
-
dropna
函数参数解释-
axis=0
-
可选参数 ,默认为0按行删
-
0, or 'index':删除包含丢失值的行
-
1, or 'columns':删除包含丢失值的列
-
-
how='any'
-
可选参数,默认为any
-
any: 如果存在NA值,则删除该行或列
-
all: 如果所有值都是NA,则删除该行或列
-
-
inplace=False
-
可选参数,不建议使用这个参数
-
默认False, 不对原数据集进行修改
-
inplce=True,对原数据集进行修改
-
-
subset接收一个列表
-
可选参数,不与thresh参数一起使用
-
接收一个列表,列表中的元素为列名: 对特定的列进行缺失值删除处理
-
-
thresh=n
-
可选参数
-
参数值为int类型,按行去除NaN值,去除NaN值后该行剩余数值的数量(列数)大于等于n,便保留这一行
-
-
-
示例代码如下
bash
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 构造示例数据集
city_day2 = city_day.sample(n=10, random_state=5)
print(city_day2)
msno.matrix(city_day2)
plt.show()
city_day2 = city_day2.dropna(how='any', subset=['PM10'])
print(city_day2)
msno.matrix(city_day2.dropna(how='any', subset=['PM10']))
plt.show()
fillna固定值填充缺失值
- 用平均值填充PM2.5的缺失值
bash
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 构造示例数据集
city_day3 = city_day.copy()
msno.matrix(city_day3)
plt.show()
# 计算PM2.5平均值
pm25_mean = city_day3['PM2.5'].mean()
print(pm25_mean)
# fillna函数填充缺失值,将返回值赋值给原来的列
city_day3['PM2.5'] = city_day3['PM2.5'].fillna(pm25_mean)
# 查看填充完缺失值的数据集
msno.matrix(city_day3)
plt.show()
fillna前后值填充缺失值
时序数据在某一列值的变化往往有一定线性规律 ,绝大多数的时序数据,具体的列值随着时间的变化而变化,所以对于有时序的行数据缺失值处理可以使用上一个非空值或下一个非空值填充
印度城市空气质量数据明显就是一个时序数据集,空气中的各种成分会随着时间变化而变化,不会出现特别大的急剧变化
- 使用上一个非空值(参数method='ffill')填充
Xylene(二甲苯)
的空值
bash
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 构造示例数据集
city_day3 = city_day.copy()
# 用上一个非空值填充并赋值指定列
city_day3['Xylene'] = city_day3['Xylene'].fillna(method='ffill')
msno.matrix(city_day3)
plt.show()
- 使用下一个非空值(参数method='ffill')填充整个数据集的空值
bash
# 导包
import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 构造示例数据集
city_day3 = city_day.copy()
city_day3 = city_day3.fillna(method='bfill')
msno.matrix(city_day3)
plt.show()
interpolate线性插值
绝大多数的时序数据,具体的列值随着时间的变化而变化。 因此,除了使用bfill和ffill进行插补以外还可以使用线性插值法:它假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值。
- 使用
df.interpolate(limit_direction="both")
对缺失数据进行线性填充
bash
# 导包
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据
city_day = pd.read_csv('../datas/data_set/city_day.csv', parse_dates=True, index_col='Date')
# 拷贝数据集
city_day4 = city_day.copy()
# 线性插值填充,并赋值
city_day4 = city_day4.interpolate(limit_direction='both')
# 画图查看
city_day4['PM2.5'][50:65].plot()
plt.show()
city_day['PM2.5'][50:65].plot()
plt.show()
5.总结:
- 缺失值会影响分析计算的结果,这个结果又要用来指导生产经营,所以要重视缺失值
- 空值仅指Pandas中的空值类型,比如`NaN`
- 缺失值包含空值,也有可能是空字符串、数字0、False或None等
- 不是空值的缺失值可以通过`replace`函数先替换为`NaN`空值,之后再按空值进行处理
- 查看空值
- `df.info()` 可以查看数据集每一列非空值的数量
- `isnull` & `notnull`函数 判断是否存在空值
- `df.isnull().sum()` 统计空值数量
- `missingno`库可以对空值进行可视化探查
- `missingno.matrix(df)` 查看缺失值的位置
- `missingno.heatmap(df)` 查看缺失值之间的相关性
- 缺失值的处理
- `df.dropna()` 删除缺失值
- `df.fillna(具体值)` 将缺失值填充为具体指
- `df.fillna(method='ffill')` 使用上一个非空值进行填充
- `df.fillna(method='bfill')` 使用下一个非空值进行填充
- `df.interpolate(limit_direction='both')` 线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值