以下分别介绍用 Excel 和 Python 的方法。举例:如下这张表格,想统计每个人出现的次数。注意:这里比单纯统计姓名复杂一丢丢,要考虑到不同班级出现同名的情况——同名并不等于同一个人,只有相同班级且同姓名的才是同一个人。所以,首先可以先用“班级+姓名”来表示一个人。在原表中增加一列,用公式 `=A2&B2` 求出 C 列,即“班级+姓名”的拼接结果;如果担心纯拼接产生歧义,还可以写成 `=A2&”|”&B2`,用分隔符把两段信息隔开。
为什么不能只按姓名统计
姓名本身不是唯一标识。不同班级出现同一个名字,行政表格里很常见;如果直接按姓名计数,就会把不同的人合并到一起。更稳妥的做法,是先用“班级+姓名”构造一个临时唯一键,再基于这个键统计。若表格里有学号、工号或身份证后几位,优先级应高于“班级+姓名”,因为它更接近真实唯一值。
Excel:辅助列配合 COUNTIF 或数据透视表
第一种方式适合临时表格。假设班级在 A 列,姓名在 B 列,从第 2 行开始:
1. 在 C2 输入 `=TRIM(A2)&”|”&TRIM(B2)`,向下填充。`TRIM` 可去掉前后空格,减少“看起来一样却统计不到一起”的问题。
2. 在 D2 输入 `=COUNTIF($C$2:$C$1000,C2)`,向下填充,即可得到每条记录对应的人出现了几次。
3. 若只想看每个人一行,可复制 C 列,使用“数据—删除重复值”,再用 `COUNTIF` 统计原 C 列。
第二种方式更直观:插入数据透视表,把“唯一标识”拖到“行”,再把“唯一标识”拖到“值”,值字段设置为“计数”。如果不想建辅助列,也可以把“班级”和“姓名”同时拖到行区域,再对姓名计数,效果类似,但辅助列更利于后续筛选和复核。
Python:pandas 分组更省事
如果表格多、需要重复处理,Python 会更合适。核心思路仍是先构造唯一标识,再分组计数:
“`python
import pandas as pd
df = pd.read_excel(“records.xlsx”)
df[“班级”] = df[“班级”].astype(str).str.strip()
df[“姓名”] = df[“姓名”].astype(str).str.strip()
df[“唯一标识”] = df[“班级”] + “|” + df[“姓名”]
counts = df.groupby(“唯一标识”).size().reset_index(name=”出现次数”)
counts.to_excel(“result.xlsx”, index=False)
dups = counts[counts[“出现次数”] > 1]
print(dups)
“`
也可以直接写 `df.groupby([“班级”, “姓名”]).size().reset_index(name=”出现次数”)`。若数据来自 CSV,把 `read_excel` 换成 `read_csv` 即可。统计结果可继续导出为 Excel、CSV,或写成 Markdown 表格。
几个容易踩的坑
- 前后空格、全角半角、不可见字符:Excel 可用 `TRIM`、`CLEAN`,Python 可用 `strip()`、`replace()`。
- 空单元格:拼接后可能产生异常值,最好先过滤或填充。
- 合并单元格:先取消合并并补全班级信息,否则辅助列会错位。
- 同班同名:若无学号,仍可能碰撞,应尽量寻找更强标识。
两种方法怎么选
Excel 适合少量数据、人工核对和临时报表;Python 适合多文件、定期重复和批量导出。若你平时在 Linux 学习空间里维护 Hexo 博客,也可以先用 Python 完成统计,再把结果整理成 Markdown 表格发布;用 Docker 固定 pandas、openpyxl 等依赖,能减少环境差异带来的麻烦。Docker 不是必需,但能让行政脚本更可迁移。
统计重复出现次数本身并不复杂,关键是把“人”的唯一标识定义清楚。先拼出“班级+姓名”,再用 `COUNTIF` 或 `groupby` 计数,就能兼顾同名不同班的情况,也让后续汇总更稳。处理历史表格时,建议保留原始列,新增辅助列,不要直接覆盖数据,方便复核。