admin 管理员组文章数量: 1086019
python处理空缺值
1.计算空缺率
mark一下pandas.shape()的用法
print("表格尺寸 = {}".format(data.shape)) # 计算表格行列数
#print(data.shape[0]) # 计算行的个数
#print(data.shape[1]) # 计算列的个数
计算若干行的空缺率
先在数据excel中第一行搞一个header,用来索引;下面代码以2:7列为例
import os
import pandas as pd
import numpy as npos.chdir(r"E:\MCM\2016\2016ProblemCDATA")
data = pd.read_excel("data1.xlsx",header = 0)print("表格尺寸 = {}".format(data.shape)) # 计算表格行列数for i in range(2,8):# 查看某 一/多 列的缺失值isnull()missing_value = data[i].isnull().sum()missing_rate = missing_value/data[i].shape[0]print("col:%d"%i)print("missing_value = %d"%missing_value)print('missing_rate = {}'.format(missing_rate))
2.拉格朗日法插补空缺值
import pandas as pd #导入pandas库
from scipy.interpolate import lagrange #导入拉格朗日函数inputfile = u'E:\\MCM\\2016\\2016ProblemCDATA\\data1.xlsx'
outputfile = u'E:\\MCM\\2016\\2016ProblemCDATA\\data2.xlsx'data= pd.read_excel(inputfile)
data[u'count'][(data[u'count']<100000) | (data[u'count']>200000)] = None #将异常值清空def ployinterp_column(s,n,k=2): #k=2表示用空值的前后两个数值来拟合曲线,从而预测空值y = s[list(range(n-k,n)) + list(range(n+1,n+1-k))] #取值,range函数返回一个左闭右开([left,right))的序列数y = y[y.notnull()]#取上一行中取出数值列表中的非空值,保证y的每行都有数值,便于拟合函数return lagrange(y.index,list(y))(n) #调用拉格朗日函数,并添加索引for i in data.columns: #如果i在data的列名中,data.columns生成的是data的全部列名for j in range(len(data)): #len(data)返回了data的长度,若此长度为5,则range(5)会产生从0开始计数的整数列表if (data[i].isnull())[j]:#如果data[i][j]为空,则调用函数ployinterp_column为其插值data[i][j] = ployinterp_column(data[i],j)data.to_excel(outputfile) #将完成插值后的data写入excel
print("拉格朗日法插补完成,插补后的文件位于:"+str(outputfile))
代码使用的过程中遇到两个问题
2.1TypeError: Can
not cast array data from dtype('float64') to dtype('U32') according to the rule '
原因:
‘U32’和‘S32’都表示numpy数组是一个字符串数组,而不是数字数组。numpy数组中,只要有一项是字符,返回的类型都是字符串数组。
解决办法:
检查数据,把字符串数组换成数字或空值即可。
2.2A value is trying to be set on a copy of a slice from a DataFrame
原因:
在python中默认的切片数据类型是“只读不能写”的,就比如生物实验中的切片,仅供观赏,而使用loc函数定位到的是原dataframe中的列,所以可修改。
See the caveats in the documentation: .html#returning-a-view-versus-a-copy
解决办法:
只不过是个warning,不影响程序跑 ;p
2.3"None of [Int64Index([-2, -1], dtype='int64')] are in the [index]"
原因:
经过艰苦的试错,我发现是因为存在某列数据开头前k个数据有空值,可能这就是lagrange函数的缺陷吧
解决办法:
调整数据,使满足前k个数据不要有空值
ps:同学用matlab插补缺失值是真的容易/(ㄒoㄒ)/~~
本文标签: python处理空缺值
版权声明:本文标题:python处理空缺值 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1693589698a230996.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论