【问题描述】
在python中经常会遇到这三个特殊值情况。尤其是导入数据文件时,就会遇到这种问题(如csv文件、数据库数据等),这些类型的数据在函数中使用需要十分小心。下面对该类型数据进行分析。
【类型分析】
from numpy import NaN
from pandas import Series, DataFrame
import numpy as np
import pandas as pd
type(NaN)
float
type(None)
NoneType
type("")
str
可以看出三种在我们看来都是空值的数值,其变量类型是不同的。
【相关分析】
下面对该类型数据做相关的处理分析:(想到哪算哪)
首先,看pandas中对此类值的处理情况。
- 先构造一个DataFrame
test = {"id":[1,2,3,4,5],"birthday":['2000-01-01','',None,'2000-01-19',NaN],"name":['王菲','莫文蔚',NaN,None,'林宥嘉'],"score":[100,99,NaN,98,None]}
test = pd.DataFrame(test)
test
- 简单统计计算
test['score'].count()
3
test['score'].sum()
297.0
test['birthday'].count()
3
从上面的例子可以看出,当进行count操作时,NaN和None都不计算在内,""则被计算在内;当进行sum等计算时,会对除NaN和None以外的值进行计算。
- 数据类型转换(初次尝试)
test['score']=test['score'].astype('int')
这是因为test的score一列中含有空值NaN,所以无法进行这一项操作,为此我们需要先做些其他的操作~
- 空值填充
- fillna()
这个函数可以使我们将空值填充为我们想要的任意值,比较常用~
test['name'] = test['name'].fillna('我是空的!')
test['birthday']=test['birthday'].fillna('空空如也!')
test
可以发现:1)fillna支持填入任何你想的值;2)fillna识别的空值是NaN和None
同时,fillna还支持:
1) 用前一个数据替代:
test_1 = test.fillna(method='pad',limit = 1)
2) 用后一个数据替代:
test_2 = test.fillna(method='bfill',limit = 1)
3)用统计量来替代:
test_2 = test.fillna(test['score'].mean())
其中limit代表了允许每一列中多少个NA值被替代~
- 数据类型转换(二次尝试)
这次我们先将score一列的值赋值为0,再进行转换就可以啦~
test['score']=test['score'].fillna(0)
test['score']=test['score'].astype('int')
test
----------------------------分割线,先到这里哈(2018-6-11)--------------------------------------