检测与处理记录重复值
- 准备数据
准备数据detail.csv,将数据文件detail.csv放到Linux本地的/course/DataAnalyze/data目录。
- 检测处理记录重复
- 菜品订单详情表中的dishes_name特征,存放了每个订单的菜品。为找出所有已点菜品,最简单的方法就是利用去重操作实现。方法一是利用列表(list)去重,如代码 41所示。
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') ##方法一 ##定义去重函数 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)) |
Out[1]: | 去重前菜品总数为: 1546 方法一去重后菜品总数为:145 |
- 除了使用代码 41中的方法一去重之外,还可以利用集合(set)的元素是唯一的特性去重,此方法为方法二,如代码 42所示。
In[2]: | ##方法二 print('去重前菜品总数为:',len(dishes)) dish_set = set(dishes) ##利用set的特性去重 print('方法二去重后菜品总数为:',len(dish_set)) |
Out[2]: | 去重前菜品总数为: 1546 方法二去重后菜品总数为:145 |
- 比较上述两种方法可以发现,未使用集合元素唯一性这一特性去重的方法明显代码 冗长,会拖慢数据分析的整体进度。使用集合元素唯一性去重的方法,看似代码 简单了许多,但是这种方法的最大问题是会导致数据的排列发生改变,如表 41所示。
源数据 | 方法一去重后数据 | 方法二去重后数据 |
蒜蓉生蚝 | 蒜蓉生蚝 | 纸杯蛋糕 |
蒙古烤羊腿 | 蒙古烤羊腿 | 爆炒鳝碌 |
大蒜苋菜 | 大蒜苋菜 | 黄尾袋鼠西拉子红葡萄酒 |
芝麻烤紫菜 | 芝麻烤紫菜 | 白斩鸡 |
蒜香包 | 蒜香包 | 香菇鸡肉粥 |
白斩鸡 | 白斩鸡 | 农夫山泉NFC果汁100%橙汁 |
- 鉴于以上方法的缺陷,pandas提供了一个名为drop_duplicates的去重方法。该方法只对DataFrame或者Series类型有效。对菜品订单详情表中的dishes_name列利用drop_duplicates的方法进行去重操作,如代码 43所示。
代码 43 使用drop_duplicates方法对菜品名称去重
In[3]: | dishes_name = detail['dishes_name'].drop_duplicates() ##对dishes_name去重 print('drop_duplicates方法去重之后菜品总数为:',len(dishes_name)) |
Out[3]: | drop_duplicates方法去重之后菜品总数为:143 |
- 事实上drop_duplicates方法不仅支持单一特征的数据去重,还能够依据DataFrame的其中一个或者几个特征进行去重操作,具体用法如代码 44所示。
代码 44 使用drop_duplicates方法对多列去重
In[4]: | print('去重之前订单详情表的形状为:', detail.shape) shapeDet = detail.drop_duplicates(subset = ['order_id','emp_id']).shape print('依照订单编号,会员编号去重之后订单详情表大小为:', shapeDet) |
Out[4]: | 去重之前订单详情表的形状为: (1546,18) 依照订单编号,会员编号去重之后订单详情表大小为: (162, 18) |