pandas调用processdata后DataFrame为NoneType报无head属性错误
报错根因定位
报错的核心原因非常明确:你自定义的processdata函数没有设置显式返回值,Python中无显式return的函数会默认返回None,你把这个None赋值给了原本存储DataFrame的data_df变量,覆盖了原有的DataFrame对象,后续调用head()方法自然会触发'NoneType' object has no attribute 'head'的错误。
具体对应到你的代码逻辑:
- 你写的
loaddata函数末尾有return(data)语句,能正常把读取到的DataFrame返回给调用方,所以第一次给data_df赋值拿到的是合法的DataFrame对象,第一次调用data_df.head()可以正常运行。 processdata函数内部的逻辑是对传入的DataFrame逐列做异常值替换、绘制箱线图,全程都是在原对象上做操作,但函数从头到尾没有写return语句返回处理后的对象。- 执行
data_df=processdata(data_df)这行代码时,函数的默认返回值None被赋值给了data_df,原来存的DataFrame被覆盖成了空值类型,后续调用方法就会报属性不存在的错误。
修复方法
两种修改方案二选一即可:
- 给
processdata函数补充返回值:在函数所有逻辑的最后一行加上return data_df,让函数把处理完成的DataFrame正常返回,你现有的赋值逻辑就可以正常工作。
补充后的函数末尾示例:def processdata(data_df): # 保留你原有的逐列异常值处理、绘图代码 for (columnName, columnData) in data_df.iteritems(): # 原有所有逻辑不变 pass # 新增下面这行返回语句 return data_df - 去掉赋值操作:因为你函数内部是对传入的DataFrame做原地修改,不需要接收返回值,直接调用
processdata(data_df)即可,不用写data_df =的赋值部分,原变量会直接保留处理后的结果。
额外提示:你代码中
median=stats.scoreatpercentile(data_df[columnName],99)取的是列的99分位数,不是统计意义上的中位数(中位数对应50分位数),这个属于业务逻辑偏差,和本次报错无关,可以根据你的实际处理需求调整。
内容的提问来源于stack exchange,提问作者adarsh sasi
相关产品推荐
相关产品推荐

