2016-05-12 9 views
0

我在嘗試匹配兩個數據幀中的兩個特定字時遇到了一點性能問題。我需要爲包含一個詞,否則0。我寫的外觀如下功能中的每一行返回一個1:在兩個數據幀之間高效應用正則表達式

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

這個功能是從一個叫拉姆達,雖然它正常工作,它需要相當長的時間跑步。我已經使用多線程來努力提高速度,但我希望它更快。有沒有辦法可能預編譯df_X.Names還是有人有另一個提示,以獲得更快/更高效?

在此先感謝您的幫助!

+0

不知道,你有'df_X.Names',但它可以用來預習像'名1正則表達式| Name2'等,如're.compile(r'\ b({})\ b'.format(「|」.join(df_X.Names)))'然後使用這個正則表達式來搜索一行。 –

+0

這大致是我想要做的,但是這樣我得到一個unicodeEncodeError,因爲'df_X'數據框包含許多不同語言(希臘語,中文,英語等)的條目 – Kizzle

+0

您的Python版本是什麼? 2.X?那麼你需要在任何地方都使用'u'''''''。 –

回答

0

IIUC您需要str.contains,多個字可以是join,|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 
相關問題