「如何将数据中的重复数据去除,只保留或提取不重复的数据,该怎么操作呢?」
本期用3种方法来解决上面的问题。
手动操作去重提取 unique高级数组函数一步提取 普通数组函数提取(可直接套用公式)
点赞收藏,根据你的需要选择合适的方法。
问题:需求
需求有三个:
将数据去重,只保留不重复的数据; 提取出去重后的客户姓名; 提取只出现过一次的客户姓名;
1.软件内置删除重复值操作
复制原数据到新的一张表中,选中所有数据。
在数据选项卡找到删除重复值按钮。
在弹出的窗口中,数据有标题记得勾选标题,下方的三列选项,全部勾上,代表只有当三列数据都完全一致,才算重复项。
点击确认删除后,会发现虽然存在多个重复姓名,但是只有一个三列全部重复的数据被删除了。
「只勾选客户姓名」
此时的订单号和消费金额已经没有意义了,可以删除。
如果想要提取只出现过一次的客户姓名,则可以使用辅助列方法。
在原数据右侧添加辅助公式列,公式向下填充,统计姓名出现次数
$B$2$B$8
统计客户姓名出现次数后筛选提取次数为1的数据。
提示:CTRL+SHIFT+L可以快速开关筛选
&
如果你的软件版本带有unique函数,那上面的操作,只需几行函数公式就搞定了。
2.unique去重函数
Microsoft 365,Excel 2021以及WPS最新版支持该函数
UNIQUE函数作用,就是返回列表或范围中的一系列唯一值。
参数如下:
=UNIQUE (array,[by_col],[exactly_once])
一共三个参数,通常情况下,你不需要做特别设置。
比如需求1中,将所有数据按行去重。
如果你是Microsoft 365用户,直接输入公式:
=UNIQUE(A1:C8)
如果是WPS,需要按照普通数组公式使用方法。
先选择承载去重后数据的空单元格区域。
E1:G7
再输入上面的公式。 最后按数组确认键CTRL+SHIFT+回车确认数组公式。
需求2要求提取去重姓名,只需要将函数的第一个参数array,也就是待去重的数据区域,缩小到姓名区域即可,公式如下:
=UNIQUE(B1:B8)
需求3要求提取只出现过一次的客户姓名,将unique函数的第三个参数改成1,即可提取恰好出现过一次的数据,公式如下:
=UNIQUE(B1:B8,,1)
如果你的软件里没有unique函数,也由于某些原因,无法更新软件,可以试试下面的普通数组公式法来代替unique,实现部分相同的功能。
3.普通数组公式代替unique去重单列数据
例如将客户姓名列数据进行去重,完整的公式如下:
$B$2$B$8
$B$2$B$8$B$2$B$8$B$2$B$2$B$8$B$2$B$8$B$2
"1:"$B$2$B$8$B$2$B$8$B$2$B$2$B$8$B$2$B$8$B$2
将公式中的下方数据,替换为自己表格中的实际待去重区域地址即可
$B$2:$B$8
$B$2「第一个单元格」WPS请按照CSE数组公式输入三步骤(上文写过),来录入公式。
完成结果如图:
点击图片放大查看看到这么长的数组公式,不用慌,分析清楚结构后,你就能直接替换其中的数据范围,自己编写出适合自己数据的公式。
3.1 普通数组函数公式解析
公式的核心就是通过index函数,从给定的数据范围里,按照给定的位置数组,输出对应数据范围的数据。
「基本公式index提取数据」
=index(B2:B8,{1;2;3})B2:B8
{1;2;3}
「match函数查找每个数据位置」
MATCH($B$2:$B$8,$B$2:$B$8,0){1;2;3;1;2;1;1}
通过选中整个查找区域到整个查找区域去匹配,我们就能得到,每一个客户姓名,首次出现在查找区域的位置。
从数字上,我们就能够看出,出现重复数字的就是存在重复情况。
「使用if函数判断是否首次出现」
ROW($B$2:$B$8){2;3;4;5;6;7;8}
如果match函数查找到的数据位置与row函数本身的数据位置一致,则说明,该行数据是首次出现,否则说明前面已经出现过了。
B2row(B2)
而match函数返回的位置数据,是相对于查找数据范围从1开始计数,因此我们需要给match函数加上这个相对位置差。
$B$2ROW($B$2)-1$
MATCH($B$2:$B$8,$B$2:$B$8,0)+(ROW($B$2)-1)=ROW($B$2:$B$8)
MATCH($B$2:$B$8,$B$2:$B$8,0)ROW($B$2:$B$8)-(ROW($B$2)-1)
如果不成立,则说明前面已经出现过这个姓名数据了,就默认返回False即可。
IF(MATCH($B$2:$B$8,$B$2:$B$8,0)+(ROW($B$2)-1)=ROW($B$2:$B$8),ROW($B$2:$B$8)-(ROW($B$2)-1))
{1;2;3;FALSE;FALSE;FALSE;FALSE}
「使用small函数,依次提取最小的数字」
{1;2;3;FALSE;FALSE;FALSE;FALSE}{1;2;3}
small函数一共有2个参数,第一个是数组,第二个是要提取第几位最小值。
{1;2;3}
small({1;2;3;FALSE;FALSE;FALSE;FALSE},{1;2;3})
{1;2;3}
想要了解,序列函数技巧,可以参考Sequence等差序列函数这篇文章。
row(1:3){1;2;3}
1:3indirect("1:3")ROW(INDIRECT("1:3"))
那么如何指定生成多少个呢?
我们可以使用count函数去统计前面if函数的结果中,数字的部分有多少个,就能直接获得需要的个数。
ROW(INDIRECT("1:3"))&
{1;2;3}ROW(INDIRECT("1:"&COUNT(IF(MATCH($B$2:$B$8,$B$2:$B$8,0)+(ROW($B$2)-1)=ROW($B$2:$B$8),ROW($B$2:$B$8)-(ROW($B$2)-1)))))
=INDEX($B$2:$B$8, SMALL( IF( MATCH($B$2:$B$8,$B$2:$B$8,0)+(ROW($B$2)-1)=ROW($B$2:$B$8),ROW($B$2:$B$8)-(ROW($B$2)-1) ), ROW(INDIRECT("1:"&COUNT(IF(MATCH($B$2:$B$8,$B$2:$B$8,0)+(ROW($B$2)-1)=ROW($B$2:$B$8),ROW($B$2:$B$8)-(ROW($B$2)-1))))) ) )
3.2那么,如何实现需求3中的,只提取恰好出现1次的数据呢?
函数公式如下:
$B$2$B$8
$B$2$B$8$B$2$B$8$B$2$B$8$B$2
"1:"$B$2$B$8$B$2$B$8$B$2$B$8$B$2
关键的不同点,在于把match函数,改成了countif函数,由查找位置数,变成了统计出现次数,并判断是否次数等于1。
最后如果还有相关问题,欢迎在评论区留言讨论。
你学会了吗?