Pandas dataframe:检查列中包含的regex是否与同一行中另一列中的字符串匹配

5ssjco0h  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(128)

输入数据是一个Pandas dataframe:

df = pd.DataFrame()
df['strings'] = ['apple','house','hat','train','tan','note']
df['patterns'] = ['\\ba','\\ba','\\ba','n\\b','n\\b','n\\b']
df['group'] = ['1','1','1','2','2','2']

df

    strings patterns    group
0   apple   \ba         1
1   house   \ba         1
2   hat     \ba         1
3   train   n\b         2
4   tan     n\b         2
5   note    n\b         2

patterns列包含正则表达式。\b是在单词边界上匹配的正则表达式模式。这意味着\ba将与'apple'匹配,因为a位于单词的开头,而它不会与'hat'匹配,因为a位于单词的中间。

我想使用patterns列中的正则表达式来检查它是否与同一行中的strings列匹配。

预期结果:

strings patterns    group
0   apple   \ba         1
3   train   n\b         2
4   tan     n\b         2

下面我使用re.search和一个逐行循环的for循环来运行它。但是这是非常低效的。我有数百万行,这个循环需要5-10分钟才能运行。

import re
for i in range(len(df)):
  pattern = df.at[i,"patterns"]
  test_string = df.at[i,"strings"]
  if re.search(pattern, test_string):
    df.at[i,'match'] = True
  else:
    df.at[i,'match'] = False

df.loc[df.match]

有没有办法做类似re.search(df['patterns'], df['strings'])的事情?

这个问题似乎是类似的:Python Pandas: Check if string in one column is contained in string of another column in the same row
但是,上面链接中的问题和答案并没有使用正则表达式来匹配,我需要使用正则表达式来指定单词边界。

7gyucuyw

7gyucuyw1#

你不能直接使用pandas内置方法。你需要每行apply一个re.search

import re

mask = df.apply(lambda r: bool(re.search(r['patterns'], r['strings'])), axis=1)
df2 = df[mask]

或者使用(faster)列表解析:

mask = [bool(re.search(p,s)) for p,s in zip(df['patterns'], df['strings'])]

输出:

strings patterns group
0   apple      \ba     1
3   train      n\b     2
4     tan      n\b     2
dgenwo3n

dgenwo3n2#

编译正则表达式的代价很高。在你的例子中,你只有很少的正则表达式,所以我会尝试缓存编译后的正则表达式:

cache = dict()
def check(pattern, string):
    try:
        x = cache[pattern]
    except KeyError:
        x = re.compile(pattern)
        cache[pattern] = x
    return x.search(string)
mask = [bool(check(p, s)) for p, s in zip(df['patterns'], df['strings'])]
print(df.loc[mask])

对于你的小 Dataframe 来说,它比@mozway的解决方案稍微长一点,但是如果我把它复制到60000行,它可以节省30%的执行时间。

相关问题