简单数据透视表以计算唯一值


134

这似乎是一个简单的数据透视表,可以学习。我想对要分组的特定值进行唯一值计数。

例如,我有这个:

ABC   123
ABC   123
ABC   123
DEF   456
DEF   567
DEF   456
DEF   456

我想要的是一个透视表,向我显示以下内容:

ABC   1
DEF   2

我创建的简单数据透视表就给了我这个(计数多少行):

ABC   3
DEF   4  

但是我想要唯一值的数量。

我真正想做的是找出第一列中所有行的值都不相同。换句话说,“ ABC”是“好”,“ DEF”是“坏”

我敢肯定有一种更简单的方法可以做,但是我想尝试一下数据透视表...


8
请注意,对于最新版本的excel,此答案最为方便。
丹尼斯·贾赫鲁丁

Answers:


108

插入第三列,然后在“单元格”中C2粘贴此公式

=IF(SUMPRODUCT(($A$2:$A2=A2)*($B$2:$B2=B2))>1,0,1)

并复制下来。现在,根据第一列和第三列创建数据透视。查看快照

在此处输入图片说明


+1我认为这比我的解决方案要容易一些,因为第一行不需要特殊值
lc。

2
好的技术。我不知道这件事。您可以使用数组函数执行相同的操作=IF(SUM((A$2:A2=A2)*(B$2:B2=B2)) > 1, 0, 1)(输入公式时按Ctrl-Shift-Enter即可在公式{}周围进行获取)。
ErikE

通用答案,不需要任何特定功能。很好的简单公式。
阿尔贝托·德卡罗

关于如何将其扩展到三列的情况有任何想法吗?
tumultous_rooster15年

13
请注意,如果使用“数据透视表”选项过滤掉某些行,此答案将无法给出正确的解决方案。假设第一行被过滤掉了。这样,ABC的总和将为0!
jarlemag

250

更新:您现在可以使用Excel 2013自动执行此操作。我将其创建为新答案,因为我以前的答案实际上解决了一个稍有不同的问题。

如果您使用的是该版本,则选择数据以创建数据透视表,然后在创建表时,请确保选中了“将数据添加到数据模型”复选框(请参见下文)。

勾选“将此数据添加到数据模型”旁边的框

然后,当您的数据透视表打开时,按常规创建行,列和值。然后单击您要计算其非重复计数的字段并编辑“字段值设置”: 编辑字段值设置

最后,向下滚动到最后一个选项,然后选择“非重复计数”。 选择选项“非重复计数”

这将更新您的数据透视表值,以显示您要查找的数据。


5
@MichaelK更好,如果您有Excel 2013
jrharshath

3
是否也可以对现有的数据透视表执行此操作,所以我们不需要重新创建200个以上的表即可访问不同的计数功能?
路易莎

12
仅供参考:如果您尚未将文件另存为Excel(.xlsx)文件(例如:您打开了.csv文件),则“将此数据添加到数据模型”的选项被禁用/显示为灰色。简单的解决方案是将文件另存为Excel文件。
PonyEars,2016年

9
Mac不支持此功能吗?该选项对我不显示。我正在使用15.27版。
jkupczak

4
Mac上确实不存在该选项,因为数据模型通常是Windows独有的功能。
Tomty,

10

我想在组合中添加一个不需要公式的附加选项,但是如果您需要在两个不同的列中计算集合中的唯一值,可能会有所帮助。使用原始示例,我没有:

ABC   123  
ABC   123  
ABC   123   
DEF   456  
DEF   567  
DEF   456  
DEF   456

并希望它显示为:

ABC   1  
DEF   2

但是更像是:

ABC   123  
ABC   123  
ABC   123  
ABC   456  
DEF   123  
DEF   456  
DEF   567  
DEF   456  
DEF   456

并希望它显示为:

ABC  
   123    3  
   456    1  
DEF  
   123    1  
   456    3  
   567    1

我发现将数据转换为这种格式,然后能够对其进行进一步处理的最佳方法是使用以下方法:

在此处输入图片说明

一旦选择“运行总计”,然后选择辅助数据集的标题(在这种情况下,它将是包含123、456和567的数据集的标题或列标题)。在您的主要数据集中,这将为您提供该集中项目总数的最大值。

然后,我复制了此数据,将其粘贴为值,然后将其放在另一个数据透视表中以更轻松地进行操作。

仅供参考,我大约有25万行数据,所以它比某些公式方法要好得多,尤其是那些试图在两列/数据集之间进行比较的方法,因为它不断使应用程序崩溃。


我遇到了一个完全不同的问题,但是这个答案只为我指明了正确的方向。谢谢。
jtolle

这个答案符合我的需要,因为我有500,000行需要应用公式,并且如果我尝试的话,计算机的内存将耗尽。谢谢!
cauldyclark '16

6

我发现最简单的方法是使用Distinct Count下面的选项Value Field Settings单击现场Values窗格)。选项Distinct Count位于列表的最底部。

点击位置

这是之前(TOP;正常Count)和之后(BOTTOM; Distinct Count

计数

分位数


3
从Office 2016开始:为了能够使用此功能,应在选中“将此数据添加到数据模型”的情况下创建数据透视表。
狮子座


3

不必对表进行排序以使以下公式为每个存在的唯一值返回1。

假设问题中显示的数据的表范围是A1:B7,请在单元格C1中输入以下公式:

=IF(COUNTIF($B$1:$B1,B1)>1,0,COUNTIF($B$1:$B1,B1))

将该公式复制到所有行,最后一行将包含:

=IF(COUNTIF($B$1:$B7,B7)>1,0,COUNTIF($B$1:$B7,B7))

这导致在第一次找到记录时返回1,此后一直返回0。

只需对数据透视表中的列求和


2
如果您有大型数据集,请使用=IF(COUNTIF($B$1:$B1,B1),1,0)-这样,countif仅运行一次!
彼得·艾伯特

2

我在此问题上的处理方法与此处看到的有所不同,因此我将分享。

  1. (首先复制您的数据)
  2. 连接列
  3. 删除串联列上的重复项
  4. 最后-以结果集为中心

注意:我想添加图片以使其更易于理解,但不能这样做,因为这是我的第一篇文章;)


1

悉达思的答案很棒。

但是,这种技术在处理大量数据时会遇到麻烦(我的计算机冻结了50,000行)。一些不太占用处理器的方法:

单一唯一性检查

  1. 按两列排序(在此示例中为A,B)
  2. 使用看少数据的公式

    =IF(SUMPRODUCT(($A2:$A3=A2)*($B2:$B3=B2))>1,0,1) 
    

多重唯一性检查

如果需要在不同的列中检查唯一性,则不能依赖两种。

代替,

  1. 单列排序(A)
  2. 添加涵盖每个分组的最大记录数的公式。如果ABC可能有50行,则公式为

    =IF(SUMPRODUCT(($A2:$A49=A2)*($B2:$B49=B2))>1,0,1)
    

2
另一个可能更少处理器密集型的方法是添加一个列C和C2 =A2&B2。然后添加列D,并在D2中放置=IF(MATCH(C2, C$2:C2, 0) = ROW(C1), 1, 0)。填满两个。尽管这仍然是从整个范围的开始进行搜索,但在找到第一个范围时会停止,并且不必将50,000行中的值相乘,而只需定位值即可,因此它的性能应该更好。
ErikE

@ErikE Sharp-我也认为您的技术在第一次发现时就停止了。但是,如果C中有很多唯一值(例如:只有50个ABC),您将继续检查大量数据。很酷的功能:当数据未排序时,您的公式最有效。
workglide

1

Excel 2013可以在枢轴中做不同的计数。如果无法访问2013,并且数据量较小,则我将原始数据制作两个副本,然后在副本b中选择两个列并删除重复项。然后做枢轴并计数您的列b。


1

您可以将COUNTIFS用于多个条件,

= 1 / COUNTIFS(A:A,A2,B:B,B2),然后向下拖动。您可以在其中放置任意多个条件,但是处理通常会花费很多时间。



0

您可以增加一列以存储唯一性,然后将汇总到数据透视表中。

我的意思是,细胞C1应该永远是1。单元格C2应包含公式=IF(COUNTIF($A$1:$A1,$A2)*COUNTIF($B$1:$B1,$B2)>0,0,1)。将此公式复制下来,以便单元格C3包含=IF(COUNTIF($A$1:$A2,$A3)*COUNTIF($B$1:$B2,$B3)>0,0,1)等等。

如果您有标题单元格,则需要将它们全部向下移动,而C3公式应为=IF(COUNTIF($A$2:$A2,$A3)*COUNTIF($B$2:$B2,$B3)>0,0,1)


0

如果您对数据进行了排序..我建议使用以下公式

=IF(OR(A2<>A3,B2<>B3),1,0)

由于它使用较少的像元进行计算,因此速度更快。


0

我通常按​​需要对字段进行排序的数据对数据进行排序,然后使用IF(A2 = A1,0,1); 您会在每个ID组的第一行中获得1。简单,无需花费大量时间即可对大型数据集进行计算。


0

您也可以使用helper列VLOOKUP。我测试了,看上去比快一点COUNTIF

如果您使用的是标头,并且数据以cell开头A2,则在该行的任何单元中使用此公式并复制同一列中的所有其他单元:

=IFERROR(IF(VLOOKUP(A2;$A$1:A1;1;0)=A2;0;1);1)

-3

我找到了一种更简单的方法。参考Siddarth Rout的示例,如果我想计算A列中的唯一值:

  • 添加一个新列C并用公式“ = 1 / COUNTIF($ A:$ A,A2)”填充C2
  • 将公式向下拖动到该列的其余部分
  • 以A列为行标签并以Sum {C列)为值进行数据透视,以获取A列中唯一值的数量

从逻辑上讲,这对于OP可能不起作用,因为它不查看column B。您将如何调整它以用于多列?
ErikE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.