百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

itomcoil 2025-10-02 01:00 8 浏览

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

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

  1. 手动操作去重提取

  2. unique高级数组函数一步提取

  3. 普通数组函数提取(可直接套用公式)

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


问题:需求

例如下图的数据表,最下方存在两条重复数据,同时也存在一个客户有多笔订单的情况。

需求有三个:

  1. 将数据去重,只保留不重复的数据;

  2. 提取出去重后的客户姓名;

  3. 提取只出现过一次的客户姓名;

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

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

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

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

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

如果想要去重客户姓名,则可以「只勾选客户姓名」,最终结果如下图所示。

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

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

  1. 在原数据右侧添加辅助公式列,公式向下填充,统计姓名出现次数

=COUNTIF($B$2:$B$8,B2)

  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去重单列数据

例如将客户姓名列数据进行去重,完整的公式如下:

=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)))))))

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


  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位的数据。

那现在最关键的就是如何计算得出{1;2;3}这个位置数组,来告诉index提取这三个位置的数据。


「match函数查找每个数据位置」

我们使用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函数本身的数据位置一致,则说明,该行数据是首次出现,否则说明前面已经出现过了。

需要注意的是,由于客户姓名所在区域是从B2开始的,这导致row(B2)返回的值也是从2开始。

而match函数返回的位置数据,是相对于查找数据范围从1开始计数,因此我们需要给match函数加上这个相对位置差。

这个相对位置差的计算方法由选择的客户姓名数据范围的第一个单元格位置$B$2减1得到,也就是ROW($B$2)-1,一定要添加$绝对引用。

最终if函数的条件式就写好了: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函数部分公式如下: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函数,依次提取最小的数字」

我们通过if函数得到了去重后的位置数组{1;2;3;FALSE;FALSE;FALSE;FALSE},现在只要使用small函数去提取出其中的{1;2;3},就完成了整个公式。

small函数一共有2个参数,第一个是数组,第二个是要提取第几位最小值。

我们这里需要提取第1、2和3位最小值,其中false不参与比较,可以把第二个参数写成{1;2;3}数组带入,一次性返回small函数提取的值。

公式如下:small({1;2;3;FALSE;FALSE;FALSE;FALSE},{1;2;3})

那问题的关键就是如何生成{1;2;3}这种序列数组,而且刚好生成3个。

想要了解,序列函数技巧,可以参考上期Sequence等差序列函数这篇文章。

使用row(1:3),就可以直接生成{1;2;3},但是如果表格被删除了1到3行中的任意行,函数会报错。

所以我们可以使用indirect函数,把原本的1:3行地址引用改成文本的indirect("1:3"),这样外界的操作就不会影响函数公式,最终的公式为ROW(INDIRECT("1:3"))

那么如何指定生成多少个呢?

我们可以使用count函数去统计前面if函数的结果中,数字的部分有多少个,就能直接获得需要的个数。

所以,别犹豫,直接复制前面的if函数公式部分,再用count函数嵌套后,替换掉ROW(INDIRECT("1:3"))这里的3,注意文本和公式拼接要使用&符号。

那最终small函数的第二个参数,需求生成{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)))))

别看这部分这么长,其实count函数里的公式都是前面写过的。最后完整的公式就成功出炉:=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次的数据呢?

函数公式如下:

=INDEX($B$2:$B$8,SMALL(IF(COUNTIF($B$2:$B$8,$B$2:$B$8)=1,ROW($B$2:$B$8)-(ROW($B$2)-1)),ROW(INDIRECT("1:"&COUNT(IF(COUNTIF($B$2:$B$8,$B$2:$B$8)=1,ROW($B$2:$B$8)-(ROW($B$2)-1)))))))

关键的不同点,在于把match函数,改成了countif函数,由查找位置数,变成了统计出现次数,并判断是否次数等于1。


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

你学会了吗?


相关推荐

Python编程实现求解高次方程_python求次幂
Python编程实现求解高次方程_python求次幂

#头条创作挑战赛#编程求解一元多次方程,一般情况下对于高次方程我们只求出近似解,较少的情况可以得到精确解。这里给出两种经典的方法,一种是牛顿迭代法,它是求解方程根的有效方法,通过若干次迭代(重复执行部分代码,每次使变量的当前值被计算出的新值...

2025-10-23 03:58 itomcoil

python常用得内置函数解析——sorted()函数

接下来我们详细解析Python中非常重要的内置函数sorted()1.函数定义sorted()函数用于对任何可迭代对象进行排序,并返回一个新的排序后的列表。语法:sorted(iterabl...

Python入门学习教程:第 6 章 列表

6.1什么是列表?在Python中,列表(List)是一种用于存储多个元素的有序集合,它是最常用的数据结构之一。列表中的元素可以是不同的数据类型,如整数、字符串、浮点数,甚至可以是另一个列表。列...

Python之函数进阶-函数加强(上)_python怎么用函数

一.递归函数递归是一种编程技术,其中函数调用自身以解决问题。递归函数需要有一个或多个终止条件,以防止无限递归。递归可以用于解决许多问题,例如排序、搜索、解析语法等。递归的优点是代码简洁、易于理解,并...

Python内置函数range_python内置函数int的作用

range类型表示不可变的数字序列,通常用于在for循环中循环指定的次数。range(stop)range(start,stop[,step])range构造器的参数必须为整数(可以是内...

python常用得内置函数解析——abs()函数

大家号这两天主要是几个常用得内置函数详解详细解析一下Python中非常常用的内置函数abs()。1.函数定义abs(x)是Python的一个内置函数,用于返回一个数的绝对值。参数:x...

如何在Python中获取数字的绝对值?

Python有两种获取数字绝对值的方法:内置abs()函数返回绝对值。math.fabs()函数还返回浮点绝对值。abs()函数获取绝对值内置abs()函数返回绝对值,要使用该函数,只需直接调用:a...

贪心算法变种及Python模板_贪心算法几个经典例子python

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。以下是贪心算法的主要变种、对应的模板和解决的问题特点。1.区间调度问题问题特点需要从一组区间中选择最大数...

Python倒车请注意!负步长range的10个高能用法,让代码效率翻倍

你是否曾遇到过需要倒着处理数据的情况?面对时间序列、日志文件或者矩阵操作,传统的遍历方式往往捉襟见肘。今天我们就来揭秘Python中那个被低估的功能——range的负步长操作,让你的代码优雅反转!一、...

Python中while循环详解_python怎么while循环

Python中的`while`循环是一种基于条件判断的重复执行结构,适用于不确定循环次数但明确终止条件的场景。以下是详细解析:---###一、基本语法```pythonwhile条件表达式:循环体...

简单的python-核心篇-面向对象编程

在Python中,类本身也是对象,这被称为"元类"。这种设计让Python的面向对象编程具有极大的灵活性。classMyClass:"""一个简单的...

简单的python-python3中的不变的元组

golang中没有内置的元组类型,但是多值返回的处理结果模拟了元组的味道。因此,在golang中"元组”只是一个将多个值(可能是同类型的,也可能是不同类型的)绑定在一起的一种便利方法,通常,也...

python中必须掌握的20个核心函数——sorted()函数

sorted()是Python的内置函数,用于对可迭代对象进行排序,返回一个新的排序后的列表,不修改原始对象。一、sorted()的基本用法1.1方法签名sorted(iterable,*,ke...

12 个 Python 高级技巧,让你的代码瞬间清晰、高效

在日常的编程工作中,我们常常追求代码的精简、优雅和高效。你可能已经熟练掌握了列表推导式(listcomprehensions)、f-string和枚举(enumerate)等常用技巧,但有时仍会觉...

Python的10个进阶技巧:写出更快、更省内存、更优雅的代码

在Python的世界里,我们总是在追求效率和可读性的完美平衡。你不需要一个数百行的新框架来让你的代码变得优雅而快速。事实上,真正能带来巨大提升的,往往是那些看似微小、却拥有高杠杆作用的技巧。这些技巧能...