如何在Pandas中匹配列表字符串并去重填充新列?
解决方案
方法1:遍历系统列表检查匹配(直观易维护)
直接对每行文本,检查每个系统是否存在(忽略大小写),收集所有匹配的系统后用逗号连接。这种方法会直接使用systems列表里的标准名称,自动避免重复项。
import pandas as pd df = pd.DataFrame({"A":["ailerons and landing gear is jammed.", "something went wrong in flaps and slats. Flaps are open", "engine is lost with flap and brake but right brake is working", "I dont know anything about elevator and engine. Engine is lost "]}) systems = ['aileron', 'landing gear', 'flap', 'slat', 'engine', 'brake', 'elevator'] def match_systems(text): text_lower = text.lower() matched = [sys for sys in systems if sys in text_lower] return ','.join(matched) df['system_name'] = df['A'].apply(match_systems)
输出结果:
| A | system_name |
|---|---|
| ailerons and landing gear is jammed. | aileron,landing gear |
| something went wrong in flaps and slats. Flaps are open | flap,slat |
| engine is lost with flap and brake but right brake is working | flap,engine,brake |
| I dont know anything about elevator and engine. Engine is lost | engine,elevator |
方法2:正则匹配后去重(保留原逻辑优化)
如果想继续用正则匹配的方式,需要对提取结果做忽略大小写的去重处理。通过将匹配项转小写后用集合去重,再连接成字符串。
import pandas as pd import re df = pd.DataFrame({"A":["ailerons and landing gear is jammed.", "something went wrong in flaps and slats. Flaps are open", "engine is lost with flap and brake but right brake is working", "I dont know anything about elevator and engine. Engine is lost "]}) systems = ['aileron', 'landing gear', 'flap', 'slat', 'engine', 'brake', 'elevator'] # 构建正则,匹配系统单词及复数形式 pattern = '|'.join([f'\\b{sys}\\w*\\b' for sys in systems]) # 提取后转小写去重,再连接 df['system_name'] = df['A'].str.findall(pattern, flags=re.IGNORECASE).apply( lambda x: ','.join(set(item.lower() for item in x)) )
两种方法对比
- 方法1适合需要严格使用
systems列表标准名称的场景,结果统一规范; - 方法2更灵活,能匹配系统单词的变体(比如复数形式),同时解决重复问题。
内容的提问来源于stack exchange,提问作者Kabir
相关产品推荐
相关产品推荐

