2017-10-18 4 views
0

Je voudrais appliquer la reconnaissance de formes à travers une table panda et mettre leur code à valide si le nom de l'auteur correspond à un certain motif. Cependant, je reçois seulement les valeurs incorrectes. J'itérer sur chaque ligne, mais je voudrais appliquer la fonction lambda que si la valeur de la cellule correspondante est à 0.Panda - Itérer sur les rangées pour la reconnaissance de formes

Author  valid 
Andi  0 
Tomasius 0 
Anke  0 

Voici mes codes:

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) 

Une fois que je me présente cette puis je me

Author  valid 
Andi  0 
Tomasius 1 
Anke  0 

Mais je voudrais avoir

Author  valid 
Andi  1 
Tomasius 0 
Anke  0 

Qu'est-ce que je fais de mal? Tout indice serait très apprécié!

Cheers, Andi

Répondre

0

Vous avez quelques problèmes. Tout d'abord, votre expression régulière correspondra à la fois Andi et , car .*nd* indique essentiellement "correspondre à 0 ou plusieurs caractères non-saut de ligne, un caractère n et 0 ou plusieurs caractères d". Deuxièmement, l'utilisation d'une boucle ne tire pas parti des capacités de Panda. Au lieu de cela, je suggère d'utiliser np.where() et str.contains() pour effectuer votre fonction d'une manière plus rapide et plus concise.

Utilisation de l'échantillon dataframe:

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

Le code suivant vous donnera ce que vous voulez:

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

Si votre requête est plus compliquée et vous avez besoin d'une expression régulière (selon votre commentaire), vous pouvez l'utiliser aussi:

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

Merci. Comment ferais-je cela si je cherchais «nd» et «as», c'est-à-dire que je cherchais deux chaînes?
df ['valide'] = np.where (df.Author.str.contains ('nd', 'as'), 1, 0) ne fonctionne pas .. –

+0

Réponse mise à jour pour les expressions régulières. – ASGM