如何在Pandas中批量查找并统一替换包含特定子字符串的分类字段

1次阅读

如何在Pandas中批量查找并统一替换包含特定子字符串的分类字段

本文介绍如何使用pandas高效识别所有含“financial services”的字符串条目,将其标准化为统一值,并合并同类项的数值统计(如求和),适用于数据清洗与类别归一化场景。

本文介绍如何使用pandas高效识别所有含“financial services”的字符串条目,将其标准化为统一值,并合并同类项的数值统计(如求和),适用于数据清洗与类别归一化场景。

在实际数据分析中,常遇到分类字段存在不规范表达的问题——例如“Financial Services”可能以独立项出现,也可能作为复合标签的一部分(如“Financial Services, Lending and Investments”或“Administrative Services, Financial Services”)。若需将所有含该关键词的记录归并为单一标准类别,并汇总其对应指标(如count),则需结合字符串匹配、条件赋值与分组聚合三步完成。

核心实现步骤

  1. 定位目标行:使用 .str.contains() 方法生成布尔掩码,精准识别 category_groups_list 列中包含 “Financial Services” 的所有行(默认大小写敏感,如需忽略大小写可添加 case=False 参数);
  2. 统一重命名:通过 .loc[] 基于掩码批量赋值,将匹配行的分类字段强制设为 “Financial Services”;
  3. 聚合统计:调用 .groupby(…).sum() 对标准化后的类别进行数值列(如 Count)求和,并设置 as_index=False 保持结果为DataFrame格式。

以下是完整可运行代码示例:

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:创建布尔掩码 mask = df["category_groups_list"].str.contains("Financial Services")  # 步骤2:批量替换为标准名称 df.loc[mask, "category_groups_list"] = "Financial Services"  # 步骤3:按新类别聚合求和 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

注意事项与进阶建议

  • 空值安全:若列中存在 NaN,.str.contains() 默认返回 NaN(即 False 逻辑上不匹配),但为保险起见,可显式添加 na=False 参数:

    mask = df["category_groups_list"].str.contains("Financial Services", na=False)
  • ? 精确匹配扩展:若需排除形似干扰项(如 “Non-Financial Services”),可改用正则表达式配合词边界 b:

    mask = df["category_groups_list"].str.contains(r"bFinancial Servicesb", regex=True, na=False)
  • ? 多关键词处理:如需同时归并多个关键词(如 “FinTech” 和 “Financial Services”),可用管道符 | 组合正则模式:

    mask = df["category_groups_list"].str.contains(r"b(Financial Services|FinTech)b", regex=True, na=False)
  • ? 保留原始明细:若后续还需分析原始组合结构,建议新增辅助列记录原始值,避免信息丢失:

    df["original_category"] = df["category_groups_list"].copy()

该方法简洁高效,兼顾可读性与健壮性,是Pandas数据预处理中的典型范式,适用于电商类目归并、行业标签清洗、问卷选项标准化等多种业务场景。

text=ZqhQzanResources