用于计算唯一值的简单数据透视表

Posted

技术标签:

【中文标题】用于计算唯一值的简单数据透视表【英文标题】:Simple Pivot Table to Count Unique Values 【发布时间】:2012-08-06 06:07:02 【问题描述】:

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

例如,我有这个:

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

我想要的是一个向我展示这个的数据透视表:

ABC   1
DEF   2

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

ABC   3
DEF   4  

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

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

我确信有一种更简单的方法可以做到这一点,但我想我会试试数据透视表...

【问题讨论】:

请注意,对于最新版本的 excel,this answer 最方便。 【参考方案1】:

您也可以将VLOOKUP 用于帮助列。我测试了一下,看起来比COUNTIF快一点。

如果您使用标题并且数据从单元格 A2 开始,则在行中的任何单元格中使用此公式并复制到同一列中的所有其他单元格中:

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

【讨论】:

【参考方案2】:

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

这里是之前(TOP;普通Count)和之后(BOTTOM;Distinct Count

【讨论】:

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

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

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 万行数据,因此这比某些公式方法效果要好得多,尤其是那些尝试跨两列/数据集进行比较的方法,因为它不断使应用程序崩溃。

【讨论】:

我遇到了一个完全不同的问题,但这个答案只是为我指明了正确的方向。谢谢。 这个答案适合我的需要,因为我有 500,000 行需要应用公式,如果我尝试这样做,我的计算机内存不足。谢谢!【参考方案4】:

第 1 步。添加一列

第 2 步。在第一条记录中使用公式 =IF(COUNTIF(C2:$C$2410,C2)>1,0,1)

第 3 步。 将其拖到所有记录中

第 4 步。 使用公式过滤列中的“1”

【讨论】:

【参考方案5】:

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

=1/COUNTIFS(A:A,A2,B:B,B2) 然后向下拖动。您可以在其中放置任意数量的标准,但往往需要花费大量时间来处理。

【讨论】:

【参考方案6】:

我解决这个问题的方法与我在这里看到的有点不同,所以我会分享一下。

    (先复制您的数据) 连接列 删除连接列上的重复项 最后 - 以结果集为中心

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

【讨论】:

【参考方案7】:

Excel 2013 可以在数据透视表中进行不同计数。如果无法访问 2013 年,并且数据量较小,我会制作原始数据的两份副本,并在副本 b 中选择两列并删除重复项。然后进行枢轴并计算您的列 b。

【讨论】:

【参考方案8】:

我通常按需要进行不同计数的字段对数据进行排序,然后使用 IF(A2=A1,0,1);然后你会在每组 ID 的第一行得到一个 1。简单,不需要任何时间来计算大型数据集。

【讨论】:

【参考方案9】:

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

如果您有该版本,则选择您的数据以创建数据透视表,并在创建表时确保选中“将此数据添加到数据模型”复选框选项(见下文)。

然后,当您的数据透视表打开时,正常创建行、列和值。然后单击要计算不同计数的字段并编辑字段值设置:

最后,向下滚动到最后一个选项并选择“不同计数”。

这应该会更新您的数据透视表值以显示您正在寻找的数据。

【讨论】:

@MichaelK 更好,如果你有 Excel 2013 是否也可以对现有数据透视表执行此操作,这样我们就不需要重新创建 200 多个表来访问不同计数功能? 仅供参考:如果您尚未将文件保存为 Excel (.xlsx) 文件(例如:您打开了 .csv 文件),请选择“将此数据添加到数据模型”被禁用/灰显。简单的解决方案是将文件另存为 Excel 文件。 Mac 不支持此功能吗?我没有出现此选项。我使用的是 15.27 版。 Mac 上确实不存在此选项,因为数据模型通常是 Windows 独有的功能。【参考方案10】:

不必为以下公式对表进行排序,以便为每个存在的唯一值返回 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。

简单地将数据透视表中的列相加

【讨论】:

如果你有一个大数据集,请使用=IF(COUNTIF($B$1:$B1,B1),1,0) - 这样,countif 只运行一次!【参考方案11】:

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

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

这更快,因为它使用更少的单元进行计算。

【讨论】:

【参考方案12】:

悉达多的回答非常棒。

然而,这种技术在处理大量数据时可能会遇到麻烦(我的计算机在 50,000 行时冻结)。一些处理器密集度较低的方法:

单次唯一性检查

    按两列排序(本例中为 A、B)

    使用查看较少数据的公式

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

多重唯一性检查

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

相反,

    排序单列 (A)

    添加涵盖每个分组的最大记录数的公式。如果 ABC 可能有 50 行,则公式为

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

【讨论】:

另一种可能较少占用处理器的方法是在 C2 中添加列 C 和 =A2&amp;B2。然后添加一列 D 并在 D2 中输入=IF(MATCH(C2, C$2:C2, 0) = ROW(C1), 1, 0)。将两者都填满。虽然它仍然从整个范围的开头进行搜索,但当它找到第一个时它会停止,并且不需要将 50,000 行中的值相乘,它只需要找到该值 - 所以它应该会执行得更好。 @ErikE Sharp - 我也认为你的技术在第一次发现时就停止了。但是如果你在 C 中有很多唯一值(例如:只有 50 个 ABC),你将继续检查大量数据。很酷的功能:当数据未排序时,您的公式效果最佳。【参考方案13】:

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

添加一个新列 C 并用公式“=1/COUNTIF($A:$A,A2)”填充 C2 将公式向下拖到列的其余部分 以 A 列作为行标签,在值中求和column C) 以获取 A 列中唯一值的数量

【讨论】:

从逻辑上讲,这不可能适用于 OP,因为它不查看列 B。您将如何调整它以处理多个列?【参考方案14】:

查看 Debra Dalgleish 的Count Unique Items

【讨论】:

【参考方案15】:

您可以创建一个额外的列来存储唯一性,然后在您的数据透视表中总结

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

如果您有一个标题单元格,您需要将这些全部向下移动一行,并且您的 C3 公式应该是 =IF(COUNTIF($A$2:$A2,$A3)*COUNTIF($B$2:$B2,$B3)&gt;0,0,1)

【讨论】:

【参考方案16】:

插入第 3 列并在单元格 C2 中粘贴此公式

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

并复制下来。现在根据第 1 列和第 3 列创建您的数据透视表。查看快照

【讨论】:

+1 我认为这比我的解决方案稍微容易一些,因为它不需要第一行的特殊值 技术不错。我不知道这个。您可以使用数组函数 =IF(SUM((A$2:A2=A2)*(B$2:B2=B2)) &gt; 1, 0, 1) 执行相同的操作(输入公式时按 Ctrl-Shift-Enter,以便在其周围获取 )。 通用答案,不需要任何特定功能。只是好的简单公式。 知道如何将其扩展到三列的情况吗? 请注意,如果您使用数据透视表选项过滤掉某些行,则此答案不会给出正确的解决方案。假设第一行被过滤掉了。然后 ABC 的总和将显示为 0!

以上是关于用于计算唯一值的简单数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

过滤数据透视表列,仅在

创建一个列出值的数据透视表

Pandas 数据透视表可用于 Excel 单独的工作表

带有文本值的 SQL Server 数据透视表

具有多个聚合值的数据透视表

EXCEL 2010学习笔记 —— 数据透视表