如何匹配两个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,输出结果如下,完全符合预期:
| UserID | Date | UserName | Description | Category |
|---|---|---|---|---|
| 101 | 2024-05-01 | Zhang San | Bought 1kg Apple for afternoon tea | Fruit |
| 102 | 2024-05-02 | Li Si | Ordered fresh brocolli for dinner salad | Vegetable |
| 103 | 2024-05-03 | Wang Wu | Picked 2kg Orange from the fruit stall | Fruit |
补充优化点
- 如果需要忽略大小写匹配,只需要把映射字典的key统一转为小写,匹配时判断
item_name.lower() in desc_text.lower()即可 - 如果存在短物品名被长物品名包含的场景(比如同时存在"Apple"和"Green Apple"两个物品),先把DF1按
Name字段长度降序排序再生成映射字典,避免短词优先匹配导致结果错误 - 如果单条订单可能包含多个不同分类的物品,把匹配逻辑改为收集所有命中的分类值拼接返回即可
内容的提问来源于stack exchange,提问作者DEs
相关产品推荐
相关产品推荐

