基于关键词多列循环的Pandas数据分类实现求助
Pandas DataFrame 批量分类解决方案
核心思路
按classes的行顺序优先级,逐行检查该行所有关键词列中的任意关键词是否在data的描述文本中(大小写不敏感、支持部分匹配),找到第一个匹配的类别后立即赋值,不再进行后续检查。
代码实现
1. 构造示例数据
先模拟你的两个DataFrame结构:
import pandas as pd # 分类规则表:category是类别,后面多列是关键词 classes = pd.DataFrame({ "category": ["实验操作", "数据处理", "文献调研"], "keyword1": ["离心", "Python", "知网"], "keyword2": ["PCR", "Excel", "PubMed"], "keyword3": ["Western Blot", "可视化", "Web of Science"] }) # 待分类数据:description是活动描述,codes为空列 data = pd.DataFrame({ "description": [ "用Python做数据可视化分析", "完成Western Blot实验", "在PubMed查找相关文献", "用Excel整理实验数据", "进行细胞培养和离心操作" ], "codes": [pd.NA] * 5 })
2. 预处理分类规则
把classes每一行的所有关键词合并成一个小写的列表(过滤空值),方便后续匹配:
# 获取所有关键词列(排除category列) keyword_cols = [col for col in classes.columns if col != "category"] # 给classes新增一列,存储该行所有有效关键词的小写集合 classes["keywords_lower"] = classes[keyword_cols].apply( lambda x: [kw.lower() for kw in x.dropna()], axis=1 )
3. 批量分类逻辑
遍历data的每一行,按classes的行顺序检查匹配,找到第一个符合条件的类别就赋值:
def assign_category(desc): desc_lower = desc.lower() # 按classes的行顺序遍历,优先级从高到低 for _, row in classes.iterrows(): # 检查描述是否包含该行任意一个关键词 if any(kw in desc_lower for kw in row["keywords_lower"]): return row["category"] # 无匹配返回空值 return pd.NA # 应用到data的codes列 data["codes"] = data["description"].apply(assign_category)
4. 查看结果
print(data)
输出结果:
description codes 0 用Python做数据可视化分析 数据处理 1 完成Western Blot实验 实验操作 2 在PubMed查找相关文献 文献调研 3 用Excel整理实验数据 数据处理 4 进行细胞培养和离心操作 实验操作
关键说明
- 优先级保障:通过
classes.iterrows()按原表行顺序遍历,找到第一个匹配就返回,确保靠前的类别优先。 - 大小写兼容:把描述和关键词都转成小写后再匹配,避免大小写差异导致的匹配失败。
- 多关键词列处理:通过
apply合并每一行的所有关键词列,统一成一个列表,避免逐个列遍历的繁琐。 - 空值处理:合并关键词时用
dropna()过滤空的关键词,避免无效匹配。
内容的提问来源于stack exchange,提问作者Turnipsavocados
相关产品推荐
相关产品推荐

