如何在Pandas的.str.extract()正则中使用DataFrame列作为变量
解决方法
由于pandas.Series.str.extract()仅支持固定正则表达式,无法直接将每行的column1值作为动态变量传入,所以我们可以通过逐行处理的方式实现需求,下面提供两种实用方案:
方案一:正则表达式动态匹配
通过apply()逐行生成正则表达式,匹配目标关键词前的对应片段:
import pandas as pd import re # 示例数据 df = pd.DataFrame({ 'column1': ['key1', 'key2', 'key3'], 'column2': ['word1/word2/key1', 'word3/word4/word5/key2', 'word6/key3'] }) def extract_with_regex(row): # 转义关键词,避免正则特殊字符(如.*?)干扰匹配 escaped_key = re.escape(row['column1']) # 正则逻辑:兼容关键词前有1个或多个斜杠的情况,捕获关键词前紧邻的片段 pattern = rf'(?:.*/)?(.*)/{escaped_key}' match_result = re.search(pattern, row['column2']) # 匹配成功返回捕获内容,失败返回None return match_result.group(1) if match_result else None # 生成提取结果列 df['extracted'] = df.apply(extract_with_regex, axis=1)
方案二:字符串分割法(更直观)
直接将column2按斜杠分割为列表,找到关键词所在位置后取前一个元素:
import pandas as pd # 示例数据同上 df = pd.DataFrame({ 'column1': ['key1', 'key2', 'key3'], 'column2': ['word1/word2/key1', 'word3/word4/word5/key2', 'word6/key3'] }) def extract_with_split(row): path_parts = row['column2'].split('/') target_key = row['column1'] if target_key in path_parts: key_index = path_parts.index(target_key) # 确保关键词不是第一个片段,避免索引越界 if key_index > 0: return path_parts[key_index - 1] # 未找到关键词或关键词在首位时返回None return None df['extracted'] = df.apply(extract_with_split, axis=1)
两种方案运行后,df['extracted']的结果均为:['word2', 'word5', 'word6'],完全符合需求。
内容的提问来源于stack exchange,提问作者Marcley Moraes
相关产品推荐
相关产品推荐

