Advertisement

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)

还没有任何评论哟~