
本文介绍如何使用pandas高效识别包含指定子字符串(如"financial services")的所有行,将其分类字段标准化为统一值,并按新类别聚合数值列(如求和),实现数据清洗与维度归约。
本文介绍如何使用pandas高效识别包含指定子字符串(如"financial services")的所有行,将其分类字段标准化为统一值,并按新类别聚合数值列(如求和),实现数据清洗与维度归约。
在数据分析实践中,原始分类字段常存在不规范表达问题——例如同一业务类别以多种形式共存(如"Financial Services"、"Financial Services, Lending and Investments"、"Administrative Services, Financial Services"等)。若需按业务大类统计指标(如总数量),必须先将所有含关键词的记录归并为单一标准标签,再执行分组聚合。
核心思路分为三步:匹配 → 替换 → 聚合。Pandas 提供了简洁高效的链式操作支持:
- 精准匹配:使用 .str.contains() 方法检测字符串是否包含目标子串。默认启用正则模式,建议显式设置 regex=False 避免特殊字符干扰;同时添加 na=False 防止空值引发错误;
- 批量替换:通过布尔索引(Boolean Indexing)定位匹配行,直接赋值更新 category_groups_list 列;
- 聚合汇总:调用 groupby(..., as_index=False).sum() 实现按新类别合并计数(自动对数值列求和)。
以下是完整可运行示例代码:
import pandas as pd
# 构建原始数据
df = pd.DataFrame({
"category_groups_list": [
"Health Care",
"Financial Services,Lending and Investments",
"Real Estate",
"Financial Services",
"Financial Services,Professional Services",
"Financial Services,Real Estate",
"Administrative Services, Financial Services"
],
"Count": [10, 15, 5, 20, 25, 10, 30]
})
# 步骤1:创建布尔掩码,匹配所有含"Financial Services"的行
mask = df["category_groups_list"].str.contains("Financial Services", regex=False, na=False)
# 步骤2:将匹配行的分类字段统一替换为标准名称
df.loc[mask, "category_groups_list"] = "Financial Services"
# 步骤3:按新分类字段分组求和,保持DataFrame结构(as_index=False)
result = df.groupby("category_groups_list", as_index=False).sum()
print(result)输出结果为:
category_groups_list Count 0 Financial Services 100 1 Health Care 10 2 Real Estate 5
✅ 关键注意事项:
- 若需完全匹配(而非子串匹配),应改用 .str.fullmatch("Financial Services") 或 .eq("Financial Services");
- 多关键词处理时,可用正则 | 连接(如 "Financial Services|Banking"),但务必保留 regex=True(默认);
- 替换前建议备份原列(如 df["category_groups_list_orig"] = df["category_groups_list"].copy()),便于追溯;
- 对于大规模数据集,.str.contains() 支持 case=False 参数实现忽略大小写的模糊匹配。
该方法兼顾准确性与性能,是Pandas数据清洗中“语义归一化”的典型实践,适用于标签合并、行业分类整合、产品线归类等多种业务场景。










