如何在Pandas DataFrame中生成记录匹配关键词的新列?
匹配指定术语并生成新列的实现方案
方案1:生成列表格式的匹配结果
利用pandas的str.findall()方法,直接提取每行字符串中所有匹配的术语,返回列表形式:
import pandas as pd # 初始化数据 df = pd.DataFrame({'String': ['Cat Dog Fish', 'Cat Dog', 'Pig Horse', 'DogFish', 'CatHorse']}) words = ['Cat', 'Dog', 'Fish'] # 构建匹配正则模式 match_pattern = '|'.join(words) # 生成匹配列 df['Matched'] = df['String'].str.findall(match_pattern) # 可选:过滤掉无匹配项的行(比如原数据里的"Pig Horse") df = df[df['Matched'].str.len() > 0].reset_index(drop=True) print(df)
执行后输出:
String Matched 0 Cat Dog Fish [Cat, Dog, Fish] 1 Cat Dog [Cat, Dog] 2 DogFish [Dog, Fish] 3 CatHorse [Cat]
方案2:生成拼接字符串格式的匹配结果
在列表匹配的基础上,用apply()将匹配到的列表元素直接拼接成字符串:
import pandas as pd df = pd.DataFrame({'String': ['Cat Dog Fish', 'Cat Dog', 'Pig Horse', 'DogFish', 'CatHorse']}) words = ['Cat', 'Dog', 'Fish'] match_pattern = '|'.join(words) # 先提取匹配列表,再拼接为字符串 df['Matched'] = df['String'].str.findall(match_pattern).apply(''.join) # 可选:过滤无匹配的行 df = df[df['Matched'] != ''].reset_index(drop=True) print(df)
执行后输出:
String Matched 0 Cat Dog Fish CatDogFish 1 Cat Dog CatDog 2 DogFish DogFish 3 CatHorse Cat
额外说明
- 如果需要精确匹配完整单词(不想让
DogFish被拆成Dog和Fish),可以给每个术语加上单词边界正则\b,修改匹配模式:match_pattern = '|'.join(r'\b{}\b'.format(word) for word in words) - 要是同一行有重复术语(比如
Cat Cat Dog),findall会返回重复项,需要去重的话可以这么改:df['Matched'] = df['String'].str.findall(match_pattern).apply(lambda x: list(set(x)))
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

