目录:
好多数据集都含缺失数据。缺失数据有多重表现形式
数据库中,缺失数据表示为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也不相等
- # 使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
加载印度城市空气质量数据集,并初步查探缺失值
- 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())
- 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())
- 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函数对应,返回结果正好相反
- 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())
- 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())
- # 导包
- 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()
- # 导包
- 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()
- # 导包
- 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强负相关

使用`dropna`函数来删除空值,具体用法如下
- # 函数用法
- 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,便保留这一行
示例代码如下
- # 导包
- 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()
用平均值填充PM2.5的缺失值
- # 导包
- 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()
时序数据在某一列值的变化往往有一定线性规律,绝大多数的时序数据,具体的列值随着时间的变化而变化,所以对于有时序的行数据缺失值处理可以使用上一个非空值或下一个非空值填充
印度城市空气质量数据明显就是一个时序数据集,空气中的各种成分会随着时间变化而变化,不会出现特别大的急剧变化
使用上一个非空值(参数method='ffill')填充Xylene(二甲苯)的空值
- # 导包
- 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')填充整个数据集的空值
- # 导包
- 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()
绝大多数的时序数据,具体的列值随着时间的变化而变化。 因此,除了使用bfill和ffill进行插补以外还可以使用线性插值法:它假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值。
使用df.interpolate(limit_direction="both") 对缺失数据进行线性填充
- # 导包
- 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()