有效地在两个数据帧之间应用正则表达式

时间:2016-05-12 08:44:48

标签: python regex pandas dataframe

在尝试匹配两个数据帧中的两个特定字时,我遇到了一些性能问题。我需要为包含单词的每一行返回1,否则返回0.我编写的函数如下所示:

def matchWords(row):
    row = row[0].upper()
    for x in df_X.Names:
        if re.search("\\b" + x + "\\b", row):
            return 1
    return 0

这个函数是从lambda调用的,虽然它工作正常,但运行需要很长时间。我已经应用多线程以提高速度,但我希望它更快。有没有办法可以预编译df_X.Names或者是否有人有另一个提示来更快/更有效?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您需要的{IIUC} str.containsjoin|)可以or多个字。上次使用numpy.where

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'d': {0: 'wa', 1: 'rs', 2: 'qn'}, 
                   'e': {0: 'i', 1: 'r', 2: 't'}, 
                   'f': {0: 'a', 1: 's', 2: 'f'}})
print df1
    d  e  f
0  wa  i  a
1  rs  r  s
2  qn  t  f

df = pd.DataFrame({'a': {0: 'wa ug dh', 1: 'rs sd qn', 2: 'ga mf rn'}, 
                   'c': {0: 'i', 1: 'r', 2: 't'}, 
                   'b': {0: 'a', 1: 's', 2: 'f'}})
print df
          a  b  c
0  wa ug dh  a  i
1  rs sd qn  s  r
2  ga mf rn  f  t

d列中的值加入分隔符|

words = "|".join(df1.d.tolist())
print words
wa|rs|qn

print df.a.str.contains(words)
0     True
1     True
2    False
Name: a, dtype: bool

print np.where(df.a.str.contains(words), 1, 0)
[1 1 0]

df['new'] = np.where(df.a.str.contains(words), 1, 0)
print df
          a  b  c  new
0  wa ug dh  a  i    1
1  rs sd qn  s  r    1
2  ga mf rn  f  t    0