
本文介绍如何将 dataframe 中某一列的非标准值统一归入“other”类别,仅保留预定义的有效标签,从而实现分类变量的规范化处理。
本文介绍如何将 dataframe 中某一列的非标准值统一归入“other”类别,仅保留预定义的有效标签,从而实现分类变量的规范化处理。
在数据分析与建模中,常需对分类字段(categorical column)进行清洗和标准化。例如,当某列 Subject 包含大量稀疏、拼写不一或含义模糊的取值(如 "b", "c", "d"),而业务上仅关注少数核心类别(如 "Health Care", "Entrepreneurship", "Engineering", "Law")时,最佳实践是将所有非白名单值统一映射为 "Other"——这既能降低维度复杂度,又可提升模型鲁棒性与可解释性。
Pandas 提供了简洁高效的向量化方式实现该逻辑。核心思路是:利用布尔索引识别不在白名单中的值,并批量赋值为 "Other"。以下为完整示例:
import pandas as pd
# 构造示例数据
df = pd.DataFrame({
"city_company": ["London", "Seattle", "Copenhagen", "Melbourne", "Mountain View", "Brisbane", "San Francisco"],
"Subject": ["Health Care", "Entrepreneurship", "Engineering", "Law", "b", "c", "d"]
})
# 定义允许的主类别(不含 "Other")
valid_subjects = ["Health Care", "Entrepreneurship", "Engineering", "Law"]
# 将所有不在 valid_subjects 中的值替换为 "Other"
df.loc[~df["Subject"].isin(valid_subjects), "Subject"] = "Other"
print(df)
输出结果:
city_company Subject 0 London Health Care 1 Seattle Entrepreneurship 2 Copenhagen Engineering 3 Melbourne Law 4 Mountain View Other 5 Brisbane Other 6 San Francisco Other
✅ 关键要点说明:
- df["Subject"].isin(valid_subjects) 返回布尔 Series,标记每个值是否属于白名单;
- ~ 是按位取反操作符,将 True/False 反转,从而精准定位需替换的行;
- 使用 .loc[boolean_mask, column] = value 实现原地赋值,安全高效,避免 SettingWithCopyWarning;
- 白名单 valid_subjects 应明确排除 "Other",避免逻辑循环(即 "Other" 不参与 isin 判断,仅作为兜底值)。
⚠️ 注意事项:
- 若原始列含空值(NaN),isin() 默认返回 False,因此 NaN 也会被替换为 "Other"。如需保留 NaN,可先用 df["Subject"].notna() 增加条件:
mask = df["Subject"].notna() & ~df["Subject"].isin(valid_subjects) df.loc[mask, "Subject"] = "Other"
- 对于大规模数据,该方法时间复杂度为 O(n),性能优异;若需更灵活的映射(如正则匹配、部分字符串匹配),可结合 str.contains() 或自定义函数 map(),但需权衡可读性与效率。
通过这一标准化步骤,Subject 列即完成从原始杂乱值到结构化分类的跃迁,为后续分组统计、独热编码(pd.get_dummies)或机器学习特征工程奠定坚实基础。










