2016-05-12 12 views
0

2つのデータフレームで2つの特定の単語を一致させようとしているときに、パフォーマンスの問題が少しあります。2つのデータフレームの間に正規表現を適用する

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

この関数は、ラムダから呼び出され、それが正常に動作しますが、それは非常に長くかかります:私は言葉や他の0次のように私はルックスを書いた関数を含む行ごとに1を返す必要があります実行する時間。速度を上げるために、私はすでにマルチスレッドを適用していましたが、より速くしたいのです。おそらくdf_X.Namesをプリコンパイルする方法はありますか、誰かがこれをより速く/より効率的にするために別のヒントを持っていますか?

ありがとうございました!

+0

あなたは 'df_X.Names'を持っていないという考えが、名1'のような正規表現を準備をするために使用することができます| (regexp)のようなもので、 '' recompile(r '\ b({})\ b'.format( "|" .join(df_X.Names))) –

+0

これはおおまかにしたいことですが、この方法では、 'df_X'データフレームにさまざまな言語(ギリシャ語、中国語、英語など)のエントリがあるのでunicodeEncodeErrorを得ます。 – Kizzle

+0

Pythonのバージョンは何ですか? 2.x?それから、どこでも '' prefex ''を使う必要があります。 –

答えて

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 
関連する問題