检测与处理特征重复值
- 准备数据
准备数据detail.csv,将数据文件detail.csv放到Linux本地的/course/DataAnalyze/data目录,并读取数据
In[1]: | import os import pandas as pd os.chdir('/course/DataAnalyze/data') detail = pd.read_csv('./detail.csv',index_col=0,encoding = 'gbk', engine = 'python') |
- 特征重复
- 在pandas中相似度的计算方法为corr,使用该方法计算相似度时,默认为“pearson”法,可以通过“method”参数调节,目前还支持“spearman”法和“kendall”法。求出菜品订单详情表(midetail1.xlsx)数据中counts列和amounts列的“kendall”法相似度矩阵,如代码 45所示。
代码 45 求出counts和amounts两列数据的相似度矩阵
In[5]: | corrDet = detail[['counts','amounts']].corr(method='kendall')## 求取销量和售价的相似度 print('销量和售价的kendall相似度为:\n',corrDet) |
Out[5]: | 销量和售价的kendall相似度为: counts amounts counts 1.000000 -0.254957 amounts -0.254957 1.000000 |
- 对订单详情表中dishes_name、counts和amounts三个特征进行pearson相似度矩阵的求解,如代码 46所示。
代码 46 求出dishes_name、counts和amounts三个特征相似度
In[6]: | corrDet1 = detail[['dishes_name','counts','amounts']].corr(method='pearson') print('菜品名称,销量和售价的pearson相似度为:\n',corrDet1) |
Out[6]: | 菜品名称,销量和售价的pearson相似度为: counts amounts counts 1.000000 -0.181056 amounts -0.181056 1.000000 |
- 除了使用相似度矩阵进行特征去重之外,可以通过DataFrame.equals的方法进行特征去重,如代码 47所示。
In[7]: | ##定义求取特征是否完全相同的矩阵的函数 def FeatureEquals(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=FeatureEquals(detail) print('detail的特征相等矩阵的前5行5列为:\n',detEquals.iloc[:5,:5]) |
Out[7]: | detail的特征相等矩阵的前5行5列为: order_id dishes_id logicprn_name parent_class_name \ order_id True False False False dishes_id False True False False logicprn_name False False True True parent_class_name False False True True dishes_name False False False False dishes_name order_id False dishes_id False logicprn_name False parent_class_name False dishes_name True |
- 再通过遍历的方式进行筛选出完全重复的特征,如代码 48所示。
In[8]: | ##遍历所有数据 lenDet = detEquals.shape[0] dupCol = [] for k in range(lenDet): for l in range(k+1,lenDet): if detEquals.iloc[k,l] & (detEquals.columns[l] not in dupCol): dupCol.append(detEquals.columns[l])##进行去重操作 print('需要删除的列为:',dupCol) detail.drop(dupCol,axis=1,inplace=True) print('删除多余列后detail的特征数目为:',detail.shape[1]) |
Out[8]: | 需要删除的列为: ['parent_class_name', 'cost', 'discount_amt', 'discount_reason', 'kick_back', 'add_info', 'bar_code', 'add_inprice'] 删除多余列后detail的特征数目为: 11 |
- 菜品数据存在重复的现象,所以需要对菜品销售数据分别做记录去重和特征去重,如代码 49所示。
In[17]: | detail = pd.read_csv('./detail.csv',index_col=0,encoding = 'gbk' ,engine = 'python') print('进行去重操作前订单详情表的形状为:',detail.shape) ##样本去重 detail.drop_duplicates(inplace = True) ##特征去重 def FeatureEquals(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=FeatureEquals(detail)## 应用上述函数 ##遍历所有数据 lenDet = detEquals.shape[0] dupCol = [] for k in range(lenDet): for l in range(k+1,lenDet): if detEquals.iloc[k,l] & (detEquals.columns[l] not in dupCol): dupCol.append(detEquals.columns[l]) ##删除重复列 detail.drop(dupCol,axis=1,inplace=True) print('进行去重操作后订单详情表的形状为:',detail.shape) |
Out[17]: | 进行去重操作前订单详情表的形状为: (1546, 18) 进行去重操作后订单详情表的形状为: (1546, 11) |