Pandas技术问题:如何用另一列作为str.extractall的匹配模式输入?
在Pandas中使用列值作为str.extract的匹配模式
要实现用Pattern列的每行内容作为正则匹配规则,对Files列执行字符串提取,可以通过以下方法实现(str.extract本身不支持直接传入逐行变化的模式,需要逐行处理):
方法一:使用apply逐行处理
这种方法直观易懂,适合小数据集:
import pandas as pd # 初始化数据 df = pd.DataFrame({"Pattern": ['a|d'], "Files": ['a.csv, b.csv, c.csv, d.csv']}) # 拆分并展开Files列,同时清理空格 df['Files'] = df['Files'].str.split(',').apply(lambda x: [s.strip() for s in x]) df = df.explode(['Files']) # 逐行应用Pattern列的正则规则提取内容 df['Expected'] = df.apply( lambda row: row['Files'].str.extract(r'({})'.format(row['Pattern']), expand=False), axis=1 ) print(df)
输出结果:
Pattern Files Expected 0 a|d a.csv a 0 a|d b.csv NaN 0 a|d c.csv NaN 0 a|d d.csv d
方法二:列表推导式结合zip(更高效)
对于大数据量,列表推导式的执行效率比apply更高:
# 基于上述处理后的df执行提取 df['Expected'] = [ pd.Series(file).str.extract(r'({})'.format(pattern), expand=False).iloc[0] for pattern, file in zip(df['Pattern'], df['Files']) ]
关键注意点
- 给
Pattern内容外层添加括号(),确保提取到正则分组的内容,和你硬编码的r'([a|d])'逻辑一致;如果你的Pattern列本身已经包含分组括号,可省略这一步。 - 必须清理
Files列的空格(str.strip()),否则空格会导致正则匹配失败。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

