输入数据是一个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
但是,上面链接中的问题和答案并没有使用正则表达式来匹配,我需要使用正则表达式来指定单词边界。
2条答案
按热度按时间7gyucuyw1#
你不能直接使用pandas内置方法。你需要每行
apply
一个re.search
:或者使用(faster)列表解析:
输出:
dgenwo3n2#
编译正则表达式的代价很高。在你的例子中,你只有很少的正则表达式,所以我会尝试缓存编译后的正则表达式:
对于你的小 Dataframe 来说,它比@mozway的解决方案稍微长一点,但是如果我把它复制到60000行,它可以节省30%的执行时间。