本文介绍一种高效、向量化的方法,使用字典映射将 dataframe 中某列的值(如姓名)匹配到预定义的多个名单列表中,并为其分配对应的层级编号(如 tier 1 / tier 2),避免显式循环,适用于数百行数据与十余个分组的场景。
本文介绍一种高效、向量化的方法,使用字典映射将 dataframe 中某列的值(如姓名)匹配到预定义的多个名单列表中,并为其分配对应的层级编号(如 tier 1 / tier 2),避免显式循环,适用于数百行数据与十余个分组的场景。
在 Pandas 数据处理中,常需根据某个字段(如 name)所属的预定义分组(如 tier1, tier2 等名单列表),为其打上分类标签(如 tier 列)。若采用 iterrows() 或 apply() 配合 in 检查,不仅代码冗长,且对 300+ 行、11 个分组的数据效率低下。更优解是预先构建反向映射字典:将每个名单中的元素作为键,将其所属 tier 编号作为值,再通过 .map() 一次性完成列赋值。
具体实现如下:
import pandas as pd
# 原始数据
d = {'name': ['Tom', 'Patrick', 'Lamar'], 'rating': [100, 97, 95]}
df = pd.DataFrame(d)
# 定义多级名单(实际中可能有 tier1 ~ tier11)
tier1 = ['Tom', 'Patrick']
tier2 = ['Lamar']
# ✅ 关键步骤:构建 name → tier 编号的映射字典
# 使用列表推导式扁平化所有 tier 列表,并记录其 tier 编号(从 1 开始)
tier_dict = {
name: tier_idx + 1
for tier_idx, tier_list in enumerate([tier1, tier2])
for name in tier_list
}
# 结果:{'Tom': 1, 'Patrick': 1, 'Lamar': 2}
# 向量化赋值:利用 map 自动对齐并填充 NaN(若 name 不在任何 tier 中)
df['tier'] = df['name'].map(tier_dict)
执行后得到目标结果:
name rating tier 0 Tom 100 1 1 Patrick 97 1 2 Lamar 95 2
✅ 优势说明:
- 高性能:.map() 是底层优化的向量化操作,远快于 Python 循环;
- 可扩展:只需将 [tier1, tier2] 替换为 [tier1, tier2, ..., tier11] 即可支持 11 个分组;
- 健壮性:未匹配的 name 值自动设为 NaN,便于后续检查遗漏项(可通过 df[df['tier'].isna()] 快速定位);
- 内存友好:字典构建仅需 O(N) 时间(N 为所有名单总长度),空间复杂度亦为 O(N)。
⚠️ 注意事项:
- 确保各 tier 列表中无重复姓名,否则后出现的 tier 编号会覆盖前者(因字典键唯一);如有重叠需求,建议改用 pd.cut() 或自定义函数配合 np.select();
- 若 tier 名称非纯数字(如 'premium', 'standard'),可直接在字典中使用字符串键值,无需修改逻辑;
- 对超大规模名单(如单个 tier 含数万条目),可考虑转为 set 提升 in 查找性能——但本方案中字典已天然具备 O(1) 查找,无需额外转换。
该方法兼顾简洁性、可读性与工程实用性,是 Pandas 分类标签生成的标准实践之一。










