目录
NaN
加载包含缺失的数据
查看缺失值
通过info函数查看缺失值
通过isnull函数查看缺失值
通过notnull函数查看缺失值
通过isnull().sum()统计空值
缺失值处理
准备数据
dropna删除缺失值
fillna平均值填充缺失值
fillna前后值填充缺失值
interpolate线性插值
NaN
-
数据库中,缺失数据表示为
NULL
-
在某些编程语言中用
NA
或None
表示 -
缺失值也可能是空字符串
''
或数值0
-
在Pandas中使用
NaN
表示缺失值-
Pandas中的NaN值来自NumPy库,NumPy中缺失值有几种表示形式:NaN,NAN,nan,他们都一样
-
-
缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空字符串
from numpy import NaN,NAN,nan
print(NaN==True) # False
print(NaN==False) # False
print(NaN==0) # False
print(NaN=='') # False
print(NaN==None) # False
print(NaN==NaN) # False
print(NaN==nan) # False
print(NaN==NAN) # False
print(nan==NAN) # False
加载包含缺失的数据
加载数据时可以通过keep_default_na
与na_values
指定加载数据时的缺失值
1)加载数据,观察缺失值默认的显示情况
import pandas as pd
df = pd.read_csv('../data/c_city_day.csv')
df.head()
2) 使用keep_default_na=False
参数加载数据,不显示默认缺失值
df = pd.read_csv('../data/c_city_day.csv', keep_default_na=False)
df.head()
3) 使用na_values
参数加载数据,通过该参数指定我们认为的缺失值
# 在这里我们通过na_values参数,指鹿为马
df = pd.read_csv('../data/c_city_day.csv', na_values=["Ahmedabad", "2015-01-01"], keep_default_na=True)
df.head(20)
查看缺失值
通过info函数查看缺失值
import pandas as pd
df = pd.read_csv('../data/c_city_day.csv')
df.info()
通过isnull函数查看缺失值
-
pd.isnull
与pd.isna
用法相同
df.head().isnull()
print('===============')
df.head().isna()
通过notnull函数查看缺失值
-
notnull函数和notna函数相同,判断是否存在非缺失值;与isnull函数对应,返回结果正好相反
df.head().notnull()
print('==================')
df.head().notna()
通过isnull().sum()统计空值
print(df['PM2.5'].isnull().sum())
print(df['PM2.5'].notnull().sum())
缺失值处理
-
删除缺失值:删除缺失值会损失信息,并不推荐删除,当缺失数据占比较高的时候,或可以忽略相关性时,可以尝试使用删除缺失值
-
填充缺失值:填充缺失值是指用一个估算的值来去替代缺失数
-
平均值、中位数
-
前后值填充,数据呈现顺序变化的时候可以使用缺失值前边或后边的值进行填充
-
-
线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值
准备数据
#%%
import pandas as pd
df = pd.read_csv('../data/c_city_day.csv')
# 随机获取10条数据
df2 = df.sample(n=10, random_state=5)
df2
dropna删除缺失值
df.dropna(axis = 0,how = 'any' ,inplace = True, subset = ['列名1','列名2',,,], thresh = n)
-
axis=0
-
可选参数 ,默认为0按行删
-
0, or 'index':删除包含缺失值的行
-
1, or 'columns':删除包含缺失值的列
-
-
how='any'
-
可选参数,默认为any
-
any: 如果存在NA值,则删除该行或列
-
all: 如果所有值都是NA,则删除该行或列
-
-
inplace=False
-
可选参数,不建议使用这个参数
-
默认False, 不对原数据集进行修改
-
inplce=True,对原数据集进行修改
-
-
subset接收一个列表
-
接收一个列表,列表中的元素为列名: 对特定的列进行缺失值删除处理
-
-
thresh=n
-
可选参数
-
参数值为int类型,按行去除NaN值,去除NaN值后该行剩余数值的数量(列数)大于等于n,便保留这一行
-
1) 删除含有缺失值的行数据
df2.dropna()
2) 删除含有缺失值的列
# 删除含有缺失值的列
df2.dropna(axis=1)
3) 删除指定列中含有缺失值的行数据
# # 删除指定列中含有缺失值的行数据
df2.dropna(how='any', subset=['PM2.5', 'Xylene', 'AQI'])
4) 删除指定列中都含有缺失值的行数据
# 删除指定列中都含有缺失值的行数据
df2.dropna(how='all', subset=['PM2.5', 'Xylene', 'AQI'])
5) 删除非空值小于12的行数据
# 删除含有缺失值的行数据, 剩余非空值个数大于等于12的行数据保留
df2.dropna(thresh=12)
fillna平均值填充缺失值
# 目标: 用平均值填充PM2.5的缺失值
# 1 加载数据
df = pd.read_csv("../data/c_city_day.csv")
# 2 验证缺失值
df.info() # 总: 29531 PM2.5: 24933
# 3 求平均值
pm25_mean = df['PM2.5'].mean()
print(pm25_mean) # 67.45057794890272
# 4 填充平均值
df['PM2.5'].fillna(pm25_mean, inplace=True)
# 5 验证
df.info() # 总: 29531 PM2.5: 29531
print(df['PM2.5'].mean())
fillna前后值填充缺失值
时序数据在某一列值的变化往往有一定线性规律,绝大多数的时序数据,具体的列值随着时间的变化而变化,所以对于有时序的行数据缺失值处理可以 使用上一个非空值或下一个非空值填充
1) 使用上一个非空值填充空值
-
使用上一个非空值(参数method='ffill')填充
Xylene(二甲苯)
的空值-
“ffill” 的全称是 “forward ffill”,即前向填充
-
# 加载数据
df = pd.read_csv('../data/c_city_day.csv')
s1 = df['Xylene'][54:64]
print(s1)
# 使用前一个非空值填充空值
print('---------------------------')
print(s1.fillna(method='ffill'))
2) 使用下一个非空值填充空值
-
使用下一个非空值(参数method='bfill')填充整个数据集的空值
-
“bfill” 的全称是 “backward fill”,即反向填充。
-
# 加载数据
df = pd.read_csv('../data/c_city_day.csv')
s1 = df['Xylene'][54:64]
print(s1)
print('---------------------------')
print(s1.fillna(method='bfill'))
interpolate线性插值
绝大多数的时序数据,具体的列值随着时间的变化而变化。 因此,除了使用bfill和ffill进行插补以外还可以使用线性插值法:它假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值。
-
使用
df.interpolate(limit_direction="both")
对缺失数据进行线性填充 -
使用
series_obj.interpolate(limit_direction="both")
对缺失数据进行线性填充
# 加载数据
df = pd.read_csv('../data/c_city_day.csv')
s1 = df['Xylene'][54:64]
print(s1)
print('---------------------------')
print(s1.interpolate(limit_direction='both'))