我们在数据清洗过程中,需要去除一些无关的变量。来减低数据的维度。
处理csv数据,本次遇见列数据非常的多,手动寻找数据重复比例非常麻烦,所以我写了个方法。自动来计算数据列中大范围重复的数据,输出该数据,并显示,该数据占总数的比例。
#定义一个函数,对数据的列进行测试,吧列数据中一些占比出现异常的选项
def count_data(train):
list1=[]
list2=[]
list3=[]
dir = {}
for col in train.columns:#对每一列数据进行循环
# print(col)
dir = train[col].drop_duplicates()#单独列数据进行去重,大于10个的直接跳过
if dir.size>10:
pass
else:#对去重后数据进行保存,储存则数据在整一列数据中对数据进行匹配
# print(dir)
for i in dir:
# print(i)
num = 0
for j in train[col]:
if j == i:
num+=1
rate = num/len(train[col])#计算出现次数在总数中的占比
if(rate>0.97):#小于0.9则数据对整体数据有影响,大于0.9则数据有可能为无关数据
print("列{}的数据占比有异常,超过百分之97数据为重复,重复率为{}".format(col,rate))
print("列{},{} 出现的次数为{}".format(col,i,num))
list1.append(col)
list2.append(num)
list3.append(rate)
# dir[col] = [num,rate]
dir = pd.DataFrame([list1,list2,list3],index = ["列名","出现次数","比例"])
return dir.T
count_data(train)
train 为数据集数据。输出结果。。
对于这部分数据,我们可以更具实际需求就行删除或者修改,考虑到这部分数据的数据量过大,一般考虑直接删除该列数据。
##根据分析的结果,把列数据对总元素的占比非常大的数据进行删除
all_data.drop(["Street"],axis = 1, inplace = True)
all_data.drop(["Utilities"],axis = 1, inplace = True)
all_data.drop(["Condition2"],axis = 1, inplace = True)
all_data.drop(["RoofMatl"],axis = 1, inplace = True)
all_data.drop(["Heating"],axis = 1, inplace = True)
在下一节中,将介绍数据缺失值的填补,对数值型数据进行填补中位数,对类别型数据进行填补众数。
有更好的方法,希望各位大神留言指教。小白学习中。。。需要各种意见完善代码,非常感谢