1 认识缺失值
缺失值几种表示形式:NAN、NaN、nan
缺失值不等同0、空字符串、True、False ,两个缺失值也不相等
import pandas as pd
from numpy import NAN,NaN,nan
#使用==运算符测试一下
print(nan == True)
print(nan == False)
print(nan == 0)
print(nan == ' ')
print(nan == NAN)
print(nan == NaN)
'''
False
False
False
False
False
False
'''
isnull (是缺失值) 或者 notnull (不是缺失值) 测试是否为缺失值
print(pd.isnull(NAN))
print(pd.isnull(52))
print(pd.isnull(' '))
print(pd.notnull(NAN))
print(pd.notnull('tree'))
print(pd.notnull(''))
'''
True
False
False
-------------------
False
True
True
'''
2 缺失值来源
一是来自包含缺失值的数据集,二是在数据整理的过程中
2.1 加载数据时
na_values=[28] : 指定额外的某数据(例28)为缺失值 NaN
keep_default_na=False : 是否将其他值(除 na_filter 指定外的)设为缺失值 。默认True
na_filter=False : 不会将任何值重置为缺失值
import pandas as pd
from numpy import NAN,NaN,nan
#添加数据集
df1 = pd.read_csv('D://postgraduatestudies/py/mypythonstudy/gapdata0.csv',encoding="utf-8",sep=',')
#na_values 指定‘wang’为缺失值
df1 = pd.read_csv('D://postgraduatestudies/py/mypythonstudy/gapdata0.csv',encoding="utf-8",sep=',',na_values=['wang'])
print(df1)
#keep_default_na=False 除‘wang’之外,其他缺失值不设置成为缺失值
df1 = pd.read_csv('D://postgraduatestudies/py/mypythonstudy/gapdata0.csv',encoding="utf-8",sep=',',na_values=['wang'],keep_default_na=False)
print(df1)
#任何值不设为缺失值,前面设置的‘wang’也失效
df1 = pd.read_csv('D://postgraduatestudies/py/mypythonstudy/gapdata0.csv',encoding="utf-8",sep=',',na_values=['wang'],keep_default_na=False,na_filter=False)
print(df1)
'''
name age country score year
0 NaN 18 zaozhuang 28.80 1999.0
1 sun 18 yantai 30.23 2000.0
2 zhao 23 linyi 24.20 1997.0
3 li 22 weihai 35.90 1998.0
4 zhang 21 NaN 34.40 NaN
5 ai 12 taian 32.20 1996.0
------------------
name age country score year
0 NaN 18 zaozhuang 28.80 1999
1 sun 18 yantai 30.23 2000
2 zhao 23 linyi 24.20 1997
3 li 22 weihai 35.90 1998
4 zhang 21 34.40
5 ai 12 taian 32.20 1996
------------------
name age country score year
0 wang 18 zaozhuang 28.80 1999
1 sun 18 yantai 30.23 2000
2 zhao 23 linyi 24.20 1997
3 li 22 weihai 35.90 1998
4 zhang 21 34.40
5 ai 12 taian 32.20 1996
'''
2.2 合并数据时
上一节数据组合内容中,关于数据的合并,行名、列名、数据数量各种因素都会引起缺失值。
2.3 用户输入值时
#创建DataFrame,可以直接将nan赋予
message = pd.DataFrame({
'name': ['wang', 'sun', 'zhang', nan],
'age': [22,24,18,NaN]
})
print(message)
#也可以指定一列为缺失值
message['year'] = ('1200',NAN,NAN,nan)
print(message)
'''
name age
0 wang 22.0
1 sun 24.0
2 zhang 18.0
3 NaN NaN
------------------
name age year
0 wang 22 1200
1 sun 23 NaN
2 zhang NaN NaN
3 NaN NaN NaN
'''
2.4 重建索引时
message = pd.DataFrame({
'year': [1998,2001,1998,1999,1999,2004,2001,2004],
'score': [22,24,18,42,47,53,35,63]
})
print(message)
#groupby分组聚合
score_exp = message.groupby(['year'])['score'].mean()
print(score_exp)
#reindex()重建索引
print(score_exp.reindex(range(1997,2006)))
'''
year
1998 20.0
1999 44.5
2001 29.5
2004 58.0
------------------
year
1997 NaN
1998 20.0
1999 44.5
2000 NaN
2001 29.5
2002 NaN
2003 NaN
2004 58.0
2005 NaN
'''
3 处理缺失数据
3.1 查找-统计缺失数据
统计每列缺失值数量
df1 = pd.read_csv('D://postgraduatestudies/py/mypythonstudy/gapdata0.csv',encoding="utf-8",sep=',')
print(df1)
print(df1.count()) #count 计算每列数据值
print(df1.shape[0]) #shape查看数据集有几行几列
print(df1.shape[0] - df1.count()) #总行数减去不缺值数 等于缺失值
'''
name age country score year
0 wang 18 zaozhuang 28.80 1999.0
1 sun 18 yantai 30.23 2000.0
2 zhao 23 linyi 24.20 1997.0
3 li 22 weihai 35.90 1998.0
4 zhang 21 NaN 34.40 NaN
5 ai 12 taian 32.20 1996.0
------------------
name 6
age 6
country 5
score 6
year 5
------------------
6
------------------
name 0
age 0
country 1
score 0
year 1
'''
统计总缺失值数量,可以使用 NumPy 中的 count_nonzero 和 isnull 方法
import numpy as np
print(np.count_nonzero(df1.isnull())) #缺失总值。 notnull不缺失总值
print(np.count_nonzero(df1['year'].isnull())) #指定查看某一列缺失值
'''
2
1
'''
value_counts 可以获取每个值的频率表(重复个数)
其中 dropna=False 参数会获取显示缺失值的个数
print(df1.year.value_counts(dropna=False))
print(df1.year.value_counts(dropna=True))
'''
1998.0 2
1999.0 1
2000.0 1
1997.0 1
NaN 1
------------------
1998.0 2
1999.0 1
2000.0 1
1997.0 1
'''
3.2 清理缺失数据
重新定义为其他值,通常为0
print(df1.fillna(0))
'''
4 zhang 21 0 34.40 0.0
'''
前值填充(fill-forward):使用前面的值填充,若前面无值无法填充,继续保持缺失值
print(df1.fillna(method='ffill'))
'''
3 li 22 weihai 35.90 1998.0
4 zhang 21 weihai 34.40 1998.0
'''
后值填充(fill-backward)
print(df1.fillna(method='bfill'))
'''
4 zhang 21 taian 34.40 1996.0
5 ai 12 taian 32.20 1996.0
'''
插值 : interpolate() 使用现有值来填充,线性方式填充
print(df1.interpolate())
'''
4 zhang 21 NaN 34.40 1997.0
'''
删除缺失值 : dropna() 默认将含有缺失值的一行都删除 ( axis=0\1 设置删除行或列)
how参数 有两种取值 : how='any' (包含缺失值就删除) 、how= 'all' (全为缺失值才删除)
thresh参数 可以指定行列至少包含多少个 非NAN 值的数量才不会被删除
df1_drop = df1.dropna()
print(df1_drop)
'''
name age country score year
0 wang 18 zaozhuang 28.80 1999.0
1 sun 18 yantai 30.23 2000.0
2 zhao 23 linyi 24.20 1997.0
3 li 22 weihai 35.90 1998.0
5 ai 12 taian 32.20 1996.0
'''
3.3 缺失值计算
多个数值计算,不包含缺失值才会被计算,包含缺失值的将返回 缺失值
df1['score_year'] = df1['score'] + df1['year']
print(df1)
'''
3 li 22 weihai 35.90 1998.0 2033.90
4 zhang 21 NaN 34.40 NaN NaN
5 ai 12 taian 32.20 1996.0 2028.20
'''
某些调用的函数或方法在计算中能忽略缺失值:mean、sum
skipna参数 指定计算中是否要忽略缺失值
print(df1.year.sum(skipna = True))
print(df1.year.sum(skipna = False))
'''
9990.0
nan
'''