pandas—缺失数据

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_nonzeroisnull 方法

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
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值