2018.5.26 dataframe缺失值处理遇到的问题

第一篇CSDN博客,类似个人的问题思考与解决笔记

  毕业论文模型部分陷入瓶颈,对几个原本特征做了Onehotencoding,存储为特征dataframe feat中,然后用sklearn中的linearRegrssion方法直接拟合,然而,评分出奇的低,竟然只有0.11多的打分,让我甚是苦恼,导师说问题不会是模型,要么就是自己处理数据方法的问题,或者是数据问题。作为一个小白菜,我所有的feature engineering都是看网上教程的,也不会 其他的方法,于是昨晚想了一晚,决定对时间数据重新编码,不分开年份和季节,2005-2014年1-4个季度,共生成36个feature。做完这一步以后,拟合优度高了0.01左右,可还是不对,于是我觉得可能是缺失值的问题,决定删除有缺失值的行。

  可问题就出现在这里,看网上用了dropna(axis = 0, how = 'any', thresh = None, subset = None, inplace = True)的方法

Park_data.dropna(axis = 0, how = 'any',thresh=None, subset=None, inplace= True)
  缺失值是删除了,重新运行所有Cell,发现在模型拟合的地方报错
ValueError                                Traceback (most recent call last)
<ipython-input-319-9aa686f9dffb> in <module>()
      4 X = feat
      5 Y = Park_data.Score
----> 6 model.fit(X, Y)
      7 model.coef_


ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

  百思不得其解,从缺失值分析的地方又排查了一遍,终于知道问题所在:dropna删除了缺失值的行以后,并不改变dataframe原本的大小,之前的shape是(5494,16),但dropna(axis = 0)之后,shape仍然不变,也就是内容删除了,但空的地方还在。导致我在get_dummise()操作时,仍生成了5494行,并且底下都为空,也就开始报错。

  定理:上述ValueError一般都是有空值存在,要仔细检查你的数据。

目前我想的解决办法是:重新建立一个dataframe存储Park_data中的1至4719条数据,再重新进行下述步骤。然后接下来用几个其他的回归模型来拟合,祝我好运!

2018.5.17解决办法!!!

本来按昨天的想法是重新建立dataframe,利用iloc函数选择原dataframe中的4719条数据,没想到,新的数据集的编号仍然为0至5743,失败!

后来无奈之下开始看书,在书中得到了答案:

利用reset_index函数来重置行的索引编号:

Park_data.reset_index(inplace = 'True', drop = 'True')
Park_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4719 entries, 0 to 4718
Data columns (total 15 columns):
ParkID             4719 non-null int64
PSA                4719 non-null object
Park               4719 non-null object
FQ                 4719 non-null object
Score              4719 non-null float64
FacilityType       4719 non-null object
FacilityName       4719 non-null object
Address            4719 non-null object
State              4719 non-null object
Zipcode            4719 non-null float64
SquareFeet         4719 non-null float64
PerimeterLength    4719 non-null float64
Acres              4719 non-null float64
Longitude          4719 non-null float64
Latitude           4719 non-null float64
dtypes: float64(7), int64(1), object(7)
memory usage: 424.0+ KB

重新查询dataframe的信息,发现已经重新编好号了,只剩下4719条信息,搞定。

不过在成功得到结果之前,我还是遇到了一个困扰我的问题,就是用了dropna()和reset_index()后缺失值并没有删除,排查了很久终于知道问题出在dropna这一步,删除完以后,要重新赋值给原dataframe Park_data,不然删了也不改变原值。


Park_data = Park_data.dropna(axis = 0, how = 'any',thresh=None, subset=None, inplace= True)
解决完这个问题以后感觉要哭出来了,小白菜的辛酸python入门之路,不容易,继续努力!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值