在做项目时遇到了一个错误:
#过滤出正常的工作经验值数据集合不正常的工作经验布尔值
dfExp=data.query('Experience>0')
negExp=data.Experience<0
mylist=data.loc[negExp]['ID'].tolist()
#对每一个工作经验为负的样本,用同年龄和教育程度的工作经验均值代替
for id in mylist:
age=data.query('ID==@id').Age.tolist()[0]
education=data.query('ID==@id').Education.tolist()[0]
df_filtered=dfExp.query('Age==@age and Education==@education')
exp=df_filtered['Experience'].median()
if exp is not np.nan:
exp=data.Experience.median()
data.loc[data.query('ID==@id').index,'Experience']=exp
print(data.Experience.describe())
sns.distplot(data.Experience)
上面这一段代码,目的是通过for循环把数据下Experience(工作经验)列中的异常值,即负值进行清洗,因为工作经验与年龄和受教育程度是高度相关的,所以把工作经验为负的值转化为相同年龄和受教育程度的中位数值。
即如果工作经验为-1,而年龄为30、受教育程度毕业生,那就把年龄为30且教育程度为毕业生的这些人的中位数,比如5,赋值给此条数据,用5去代替-1。
可是运行完这个数据后却报错了cannot convert float NaN to integer
大意:不能把浮点类型的空值NaN转换成整数。
百思不得其解
首先我比较奇怪难道数据一开始存在NaN么?
data[data['Experience'].isnull()]
于是输入了上面代码,发现对工作经验列进行处理之前数据中是没有空值存在的,显然这些空值是在数据进行处理后产生的。
于是对于数据代码我也反复确认了,发现其中并没有什么有问题的地方。
于是问了度娘:
原来是安装的matplotlib有bug存在,在Annoconda中更显一下就好了。
pip install --upgrade matplotlib_venn
安装成功后重启notebook,果然不再报错!