2017-10-18 17 views
0

私はパンダテーブル全体にパターン認識を適用し、著者名が特定のパターンと一致する場合にそのコードを有効にしたいと考えています。しかし、私は間違った値を取得します。私はそれぞれの行を反復処理していますが、私は0です。ここパンダ - パターン認識のために行を繰り返す

Author  valid 
Andi  0 
Tomasius 0 
Anke  0 

に対応するセルの値がある場合にのみ、ラムダ関数を適用したいことは、私のコードです:

df["valid"] =0 
def author_check(x, y):  
    if str(x) == y:    
     return 1  
    else: 
     return 0 
import re 
author_list =["Andi","Tomasius"]#] 
regex_list = [".*nd*"] 
for i in range(len(author_list)): 
    for x in range(len(regex_list)): 
     r = re.compile(regex_list[x]) 
     newlist = filter(r.match, author_list) 
     x = len(list(newlist))   
     if x>0:     
      df['brand'] = df.apply(lambda row: author_check(row['Author'], author_list[i]), axis=1) 

私はこれを実行しているたら、その後、私は

Author  valid 
Andi  0 
Tomasius 1 
Anke  0 

を取得しかし、私は持っていたいと思い

Author  valid 
Andi  1 
Tomasius 0 
Anke  0 

どうすれば間違っていますか?どんなヒントでも大歓迎です!

乾杯、 アンディ

答えて

0

あなたは、いくつかの問題を抱えています。最初に、正規表現は、AndiAnkeの両方に一致します。.*nd*は本質的に「0以上の改行なしの文字、n文字、0以上のd文字」に一致するためです。第二に、ループを使用してもPandaの機能は利用されません。代わりに、np.where()str.contains()を使用して、より高速で簡潔な方法で機能を実行することをお勧めします。次のコードは何をしたいあなたを与えるだろう

df = pd.DataFrame({'Author': ['Andi', 'Tomasius', 'Anke'], 'valid': [0, 0, 0]}) 

df['valid'] = np.where(df.Author.str.contains('nd'), 1, 0) 

クエリが複雑であり、あなたはあなたのコメントどおり、正規表現を(必要な場合は、サンプルのデータフレームを使用して

)、あなたもそれを使用することができます:

p = re.compile(r'(?:as)|(?:nd)') 
df['valid'] = np.where(df.Author.str.contains(p), 1, 0) 
+0

ありがとう。 「nd」と「as」を検索する場合、2つの文字列を検索するとどうすればよいですか?
df ['valid'] = np.where(df.Author.str.contains( 'nd'、 'as')、1,0)が機能しません。 –

+0

regexesの答えが更新されました。 – ASGM

関連する問題