You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于关键词多列循环的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:15:35