excel学习库

excel表格_excel函数公式大全_execl从入门到精通

想要优雅的Excel数据去重,还得是unique函数

「如何将数据中的重复数据去除,只保留或提取不重复的数据,该怎么操作呢?」

本期用3种方法来解决上面的问题。

  1. 手动操作去重提取
  2. unique高级数组函数一步提取
  3. 普通数组函数提取(可直接套用公式)

点赞收藏,根据你的需要选择合适的方法。


问题:需求

需求有三个:

  1. 将数据去重,只保留不重复的数据;
  2. 提取出去重后的客户姓名;
  3. 提取只出现过一次的客户姓名;

1.软件内置删除重复值操作

复制原数据到新的一张表中,选中所有数据。

在数据选项卡找到删除重复值按钮。

在弹出的窗口中,数据有标题记得勾选标题,下方的三列选项,全部勾上,代表只有当三列数据都完全一致,才算重复项。

点击确认删除后,会发现虽然存在多个重复姓名,但是只有一个三列全部重复的数据被删除了。

「只勾选客户姓名」

此时的订单号和消费金额已经没有意义了,可以删除。

如果想要提取只出现过一次的客户姓名,则可以使用辅助列方法。

  1. 在原数据右侧添加辅助公式列,公式向下填充,统计姓名出现次数
$B$2$B$8
  1. 统计客户姓名出现次数后筛选提取次数为1的数据。

提示:CTRL+SHIFT+L可以快速开关筛选

&

如果你的软件版本带有unique函数,那上面的操作,只需几行函数公式就搞定了。

2.unique去重函数

Microsoft 365,Excel 2021以及WPS最新版支持该函数

UNIQUE函数作用,就是返回列表或范围中的一系列唯一值。

参数如下:

=UNIQUE (array,[by_col],[exactly_once])

来自office支持

一共三个参数,通常情况下,你不需要做特别设置。

比如需求1中,将所有数据按行去重。

如果你是Microsoft 365用户,直接输入公式:

=UNIQUE(A1:C8)

如果是WPS,需要按照普通数组公式使用方法。

  1. 先选择承载去重后数据的空单元格区域。

E1:G7

  1. 再输入上面的公式。
  2. 最后按数组确认键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


将公式中的下方数据,替换为自己表格中的实际待去重区域地址即可

  1. $B$2:$B$8

  2. $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。


最后如果还有相关问题,欢迎在评论区留言讨论。

你学会了吗?

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接