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 np

os.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: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.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ㄒ)/~~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值