
本文介绍在 Pandas 中实现“指定类别单独分组,其余统一归入‘Other’”的两种简洁、高效方法——使用 pd.Categorical 和布尔掩码分组,避免手动过滤拼接,真正 Pythonic。
本文介绍在 pandas 中实现“指定类别单独分组,其余统一归入‘other’”的两种简洁、高效方法——使用 `pd.categorical` 和布尔掩码分组,避免手动过滤拼接,真正 pythonic。
在实际数据分析中,我们常需对关键类别(如重点客户、核心产品)单独聚合,而将剩余所有项合并为一个“Other”桶进行汇总。Pandas 的标准 groupby 本身不直接支持“目标值 + 其余归并”的二分逻辑,但可通过语义清晰、性能良好的技巧优雅实现。
✅ 方法一:使用 pd.Categorical 显式定义双类别
该方法显式声明分类结构,语义明确且保留原始顺序(若需控制输出顺序,可调整 categories 列表):
import pandas as pd
df = pd.DataFrame({
"Col1": ["A", "A", "B", "B", "C"],
"Col2": [2, 3, 1, 4, 7]
})
# 创建二值分类:仅保留"A"为独立类,其余自动映射为"Other"
cat = pd.Categorical(df["Col1"], categories=["A", "Other"]).fillna("Other")
# 按分类分组求和
result = df.groupby(cat, observed=False)["Col2"].sum()
print(result)
输出:
A 5 Other 12 Name: Col2, dtype: int64
⚠️ 注意:observed=False 确保即使 "Other" 在原始列中未出现,也能保留在结果索引中;若仅关心实际存在的组,可设为 True(此时若全为 "A",则 "Other" 不会出现)。
✅ 方法二:基于布尔掩码的分组(更轻量)
利用布尔 Series 作为分组键(True/False),再重命名索引,代码更短,适合快速脚本:
result = (
df.groupby(df["Col1"] == "A")["Col2"]
.sum()
.rename(index={True: "A", False: "Other"})
)
print(result)
输出:
Col1 Other 12 A 5 Name: Col2, dtype: int64
? 提示:此方法天然按 False→True 排序(即 "Other" 在前),若需 "A" 优先,可链式调用 .reindex(["A", "Other"])。
? 总结与选型建议
- 推荐 pd.Categorical 方案:语义最清晰、可扩展性强(如后续需增加 "B" 为第三类,只需修改 categories 列表);支持 observed 参数精细控制输出。
- 推荐布尔掩码方案:代码极简、无需导入额外逻辑,适合单次性、二元分组场景。
- 二者均避免了 df[df["Col1"]=="A"] 与 df[df["Col1"]!="A"] 分别聚合再 pd.concat() 的冗余操作,真正符合 Pandas 的向量化哲学。
无论哪种方式,都比手动切片+合并更健壮、更易维护——这才是地道的 Pythonic Pandas 实践。










