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

如何匹配两个Dataframe列的子串并为目标表新增对应分类列

Pandas实现订单内容匹配物品分类

基础数据说明

现有两个数据集:

  • DF1:物品分类映射表,包含ID、Name、Category三个字段,示例映射规则:Apple、Orange对应Fruit分类,brocolli、Spinach对应Vegetable分类
  • DF2:用户订单表,包含UserID、Date、UserName、Description四个字段,Description字段存储订单具体内容,需要识别字段内包含的物品名,匹配对应分类新增为Category列,最终3条示例订单需分别匹配到Fruit、Vegetable、Fruit分类

实现代码

首先构造测试数据集:

import pandas as pd

# 构造分类映射表DF1
df1 = pd.DataFrame({
    "ID": [1, 2, 3, 4],
    "Name": ["Apple", "Orange", "brocolli", "Spinach"],
    "Category": ["Fruit", "Fruit", "Vegetable", "Vegetable"]
})

# 构造示例订单表DF2
df2 = pd.DataFrame({
    "UserID": [101, 102, 103],
    "Date": ["2024-05-01", "2024-05-02", "2024-05-03"],
    "UserName": ["Zhang San", "Li Si", "Wang Wu"],
    "Description": [
        "Bought 1kg Apple for afternoon tea",
        "Ordered fresh brocolli for dinner salad",
        "Picked 2kg Orange from the fruit stall"
    ]
})

执行分类匹配逻辑:

# 生成物品名到分类的映射关系
name_category_map = dict(zip(df1["Name"], df1["Category"]))

# 定义单行文本匹配函数
def get_category(desc_text):
    for item_name, category in name_category_map.items():
        # 检测当前描述中是否包含目标物品名
        if item_name in desc_text:
            return category
    # 无匹配项时返回空值,可按需替换为"其他分类"等自定义值
    return pd.NA

# 为DF2新增分类列
df2["Category"] = df2["Description"].apply(get_category)

结果验证

执行完成后打印df2,输出结果如下,完全符合预期:

UserIDDateUserNameDescriptionCategory
1012024-05-01Zhang SanBought 1kg Apple for afternoon teaFruit
1022024-05-02Li SiOrdered fresh brocolli for dinner saladVegetable
1032024-05-03Wang WuPicked 2kg Orange from the fruit stallFruit

补充优化点

  • 如果需要忽略大小写匹配,只需要把映射字典的key统一转为小写,匹配时判断item_name.lower() in desc_text.lower()即可
  • 如果存在短物品名被长物品名包含的场景(比如同时存在"Apple"和"Green Apple"两个物品),先把DF1按Name字段长度降序排序再生成映射字典,避免短词优先匹配导致结果错误
  • 如果单条订单可能包含多个不同分类的物品,把匹配逻辑改为收集所有命中的分类值拼接返回即可

内容的提问来源于stack exchange,提问作者DEs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:57:15