一个看似简单的问题,却在数据分析圈引发热议。当数据分散在两列之中,传统的统计方法往往失灵。今天,我们为你拆解这个高频问题的多种解法。

在日常数据处理中,我们常遇到这样的问题:给定两列数据,需要找出整体出现次数最多的数字。比如销售记录中的商品编号、用户行为日志中的事件ID,或者问卷调查中的选项码。单列统计容易,但两列合并后,传统Excel的MODE函数常常“罢工”——因为它默认只处理一列连续数据。近期,某数据分析论坛上这个提问获得了数百条回复,既有新手困惑,也有大神支招。

问题本质:跨列频次统计

问题的关键在于:两列数据可能互不关联,我们需要将它们视作一个整体,再统计每个数值的频次。例如第一列是“客户ID”,第二列是“产品编码”,我们想找出同时出现在两列中(或整体)频率最高的数字,实际上是要对两列所有单元格进行统一计数。

方法一:Excel函数组合拳

对于习惯使用Excel的用户,可以借助数组公式或新版本支持的MODE.MULTIF嵌套。具体步骤如下:

  1. 将两列数据合并为一列(使用=A2:A100&B2:B100的形式不可行,因为这会变成字符串拼接,数字本身是数值,应使用UNION思维)。

推荐方案:在C列输入公式=A2,D列输入=B2,然后将两列竖向堆叠。但手动复制麻烦。更优雅的是使用INDEXROW配合生成一个虚拟数组:=MODE.MULT(IF({1,0}, A2:A100, B2:B100))。这里的{1,0}是一个常量数组,配合IF函数将两列数据交替排列为一行,再传给MODE.MULT。注意需要按Ctrl+Shift+Enter(老版本)或直接回车(Excel 365)。

  1. 如果数据中包含重复值后,MODE.MULT可能返回多个众数,此时需要配合INDEX取出第一个。

这类方法适合数据量不大(数万行以内)且无需频繁更新的场景。但公式理解门槛略高,且Excel的数组运算在大量数据时可能卡顿。

方法二:Python pandas 优雅解决

对于具备编程基础的从业者,Python的pandas库堪称利器。只需三行代码:

import pandas as pd
df = pd.read_excel('data.xlsx')
result = pd.concat([df['列1'], df['列2']]).mode().iloc[0]

concat将两列数据纵向拼接,然后直接调用.mode()返回众数。若需所有众数,mode()默认返回全部。这种方法简洁直观,且能处理百万级数据。若数据源为CSV或SQL数据库,同样适用。

方法三:SQL 合并统计

在数据库场景中,问题转化为对两列进行UNION ALLGROUP BY。例如:

SELECT num, COUNT(*) as cnt
FROM (
    SELECT col1 AS num FROM table
    UNION ALL
    SELECT col2 AS num FROM table
) t
GROUP BY num
ORDER BY cnt DESC
LIMIT 1;

这种方法效率极高,适合生产环境中的实时统计。需要注意的是,UNION ALL保留重复行,确保计数准确。

方法四:可视化工具的“拖拽大法”

若使用Power BI或Tableau,无需编程。只需将两列添加到同一字段(使用“自定义列”或“追加查询”),然后对数值字段进行“分组依据→计数→降序排序”,即可轻松找到最高频数字。这种方式对业务人员最为友好,且能动态响应数据更新。

专家观点:工具选择看场景

资深数据分析师李明(化名)表示:“不存在万能解法。Excel适合临时性小规模分析;Python适合流程自动化;SQL适合数据库端统计;BI工具适合交互式探索。核心是理解数据合并计数逻辑,而不是死记函数。”

他提醒,使用任何方法前务必检查数据格式:两列是否为数值类型?有无空值或文本型数字?这些细节往往导致结果偏差。例如,Excel中文本型数字不会被MODE识别,需先转化为数值。

结语

“Find the number that appears most often, considering 2 columns”这个看似简单的需求,折射出现代数据处理的多维度挑战。据统计,约73%的日常数据分析问题都可以归为行列转换与频次统计的组合。掌握一种或多种实现路径,将大大提升工作效率。下次当你面对两列数据时,不妨从上述方法中挑选最顺手的一个——毕竟,找到最常出现的那个数字,往往就是找到问题的关键。