python数据分析中使用pandas进行预处理 的清洗数据
发布时间
阅读量:
阅读量
清洗数据
一、检测与处理重复值
1.记录重复
①利用list去重
import pandas as pd
detail=pd.read_csv('../数据分析/detail.csv',index_col=0,encoding='gbk')
#定义去重函数
def delRep(list1):
list2=[]
for i in list1:
if i not in list2:
list2.append(i)
return list2
#去重
dishes=list(detail['dishes_name']) #将dishes_name从数据框中提取出来
print('去重前菜品总数为:',len(dishes))
dish=delRep(dishes) #使用函数去重
print('去重之后的菜品总数为:',len(dish))
②使用set的特性去重
print('去重前菜品总数为:',len(dishes))
dish_set=set(dishes) #利用set 的特性去重
print('去重之后的菜品总数为:',len(dish_set))
③ 使用drop_duplicates方法 去重
#对dishes_name 去重
dishes_name=detail['dishes_name'].drop_duplicates()
print('drop_duplicates方法去重之后:',len(dishes_name))

2.特征重复
①求出counts和amounts两列数据的Kendall法相似度矩阵
import pandas as pd
detail=pd.read_csv('../数据分析/detail.csv',index_col=0,encoding='gbk')
corrDet=detail[['counts','amounts']].corr(method='kendall')
print('矩阵',corrDet)
②求出dishes_name,counts,amounts 这3个特征的person法相似度矩阵
corrDet1=detail[['dishes_name','counts','amounts']].corr(method='pearson')
print('3个特征',corrDet1)
③使用DataFrame.equals 方法去重
def FeatureEquels(df): #定义求取特征是否完全相同的矩阵的函数
dfEquals=pd.DataFrame([],columns=df.columns,index=df.columns)
for i in df.columns:
for j in df.columns:
dfEquals.loc[i,j]=df.loc[:,i].equals(df.loc[:,j])
return dfEquals
detEquals=FeatureEquels(detail)
print(detEquals.iloc[:5,:5])
④通过遍历的方式进行数据筛选
#遍历所有数据
lenDet=detEquals.shape[0]
dupCol=[]
for k in range(lenDet):
for l in range(k+1,lenDet):
if detEquals.iloc[k,1]& (detEquals.columns[1] not in dupCol):
dupCol.append(detEquals.columns[1])
print('需要删除的列:',dupCol)
detail.drop(dupCol,axis=1,inplace=True)
print('删除多余列后detail 的特征数目为:',detail.shape[1])

二、检测与处理数据的缺失值 应用 isnull 和 notnull 的方法 进行缺失数据的鉴别
print('detail每个特征缺失的数目为:\n',detail.isnull().sum())
print('detail每个特征非缺失的数目为:\n',detail.notnull().sum())
1.删除法
print('去除缺失的列 前detail的形状为:',detail.shape)
print('去除缺失的列 后detail的形状为:',detail.dropna(axis=1,how='any').shape)
2.替换法
detail=detail.fillna(-99)
print('detail每个特征缺失的数目为:\n',detail.isnull().sum())
3.插值法
#线性插值
import numpy as np
from scipy.interpolate import interp1d
x=np.array([1,2,3,4,5,8,9,10])
y1=np.array([2,8,18,32,50,128,162,200])
y2=np.array([3,5,7,9,11,17,19,21])
LinearInsValues1=interp1d(x,y1,kind='linear')
LinearInsValues2=interp1d(x,y2,kind='linear')
print('当x为6,7时,使用线性插值y1为:',LinearInsValues1([6,7]))
print('当x为6,7时,使用线性插值y2为:',LinearInsValues2([6,7]))
#拉格朗日插值
from scipy.interpolate import lagrange
LargeInsValues1=lagrange(x,y1)
LargeInsValues2=lagrange(x,y2)
print('当x为6,7时,使用拉个朗日插值y1:',LargeInsValues1([6,7]))
print('当x为6,7时,使用拉个朗日插值y2:',LargeInsValues2([6,7]))
#样条插值
from scipy.interpolate import spline
SplineInvalues1=spline(x,y1,xnew=np.array([6,7]))
SplineInvalues2=spline(x,y2,xnew=np.array([6,7]))
print('当x为6,7时,使用样条插值y1为:',SplineInvalues1)
print('当x为6,7时,使用样条插值y2为:',SplineInvalues2)
三、检测与处理数据的异常值
1.3δ原则(正态分布)
def outRange(Ser1):
boolInd=(Ser1.mean()-3*Ser1.std()>Ser1) | (Ser1.mean()+3*Ser1.var()<Ser1)
index=np.arange(Ser1.shape[0])[boolInd]
outrange=Ser1.iloc[index]
return outrange
outlier=outRange(detail['counts'])
print('使用3δ原则判定异常值个数为:',outlier.shape[0])
print('异常值的最大值为:',outlier.max())
print('异常值的最小值为:',outlier.min())
#2.箱线图分析
import matplotlib.pyplot as plt
plt.figure(figsize=(10,8))
p=plt.boxplot(detail['counts'].values,notch=True)
outlier1=p['fliers'][0].get_ydata()
plt.savefig('../数据分析/菜品异常数据识别.png')
plt.show()
print('销售量数据异常值个数为:',len(outlier1))
print('销售量数据异常值的最大值为:',max(outlier1))
print('销售量数据异常值的最小值为:',min(outlier1))

全部评论 (0)
还没有任何评论哟~
