如何判断Pandas列字符串是否含字典值并生成对应键的新列
解决方案
我们可以通过构建反向映射+匹配的方式,快速实现给Pandas数据框新增匹配类别的需求,以下是具体实现步骤:
1. 准备基础数据
先定义原始字典和数据框:
import pandas as pd # 定义车型类别与具体车型的映射字典 vehicle_dict = {'Car': ['Merc', 'BMW', 'Ford', 'Suzuki'], 'MotorCycle': ['Harley', 'Yamaha', 'Triump']} # 创建原始数据框 df = pd.DataFrame({ 'Person': ['A', 'B'], 'Sentence': ['He drives a Merc', 'He rides a Harley'] })
2. 方法一:正则匹配(高效适合大数据量)
先构建反向映射字典,把每个具体车型关联到对应的类别,再用正则快速提取匹配项:
# 构建反向映射:具体车型 → 类别 reverse_map = {model: category for category, models in vehicle_dict.items() for model in models} # 拼接正则匹配模式,匹配任意一个车型 pattern = '|'.join(reverse_map.keys()) # 提取Sentence中的车型,并映射到对应类别 df['Vehicle'] = df['Sentence'].str.extract(f'({pattern})', expand=False).map(reverse_map)
执行后得到的结果:
| Person | Sentence | Vehicle |
|---|---|---|
| A | He drives a Merc | Car |
| B | He rides a Harley | MotorCycle |
3. 方法二:逐行遍历(逻辑直观)
如果需要更直白的逻辑判断,可以用apply逐行检查Sentence是否包含某类别的车型:
def match_vehicle(sentence): for category, models in vehicle_dict.items(): if any(model in sentence for model in models): return category return None # 无匹配时返回空值 df['Vehicle'] = df['Sentence'].apply(match_vehicle)
注意事项
- 若Sentence中存在多个匹配车型(比如同时出现
Merc和Harley),两种方法都会返回第一个匹配到的类别,可根据需求调整匹配优先级。 - 如需不区分大小写的匹配,可在正则中添加
flags=re.IGNORECASE,或在逐行判断时将字符串统一转为小写。
内容的提问来源于stack exchange,提问作者dratoms
相关产品推荐
相关产品推荐

