2017-10-19 14 views
1

J'ai une question concernant mon dataframe. Plus précisément, dans une colonne, pour chaque rangée, j'ai une liste de conférenciers et de discours. Maintenant, je veux choisir exactement un discours, basé sur si le locuteur est celui que je cherche, qui est noté dans une autre colonne. Donc une colonne fournit le nom que je cherche et l'autre colonne fournit une liste de tous les locuteurs (prénom et nom) et leur discours et je veux créer une nouvelle colonne où ce discours est stocké dans la rangée respective.Choisissez une entrée dans une liste si sa clé contient une chaîne d'une autre colonne

Donc, mon jeu de données initial ressemble à ceci:

ticker year quarter exel_lname jobposition speech 
xx  2009 1  Angle  CEO   [("Mike Angle", "Thank you"), ("Barbara Barth", "It is")] 
xx  2009 1  Barth  CFO   [("Mike Angle", "Thank you"), ("Barbara Barth", "It is")] 
xx  2009 2  Angle  CEO   [("Mike Angle", "I am surprised"), ("Barbara Barth", "So am I")] 
xx  2009 2  Barth  CFO   [("Mike Angle", "I am surprised"), ("Barbara Barth", "So am I")] 
yy  2008 3  Cruz  CEO   [("Damien Cruz", "Hello"), ("Lara Dolm", "Nice to meet you")] 
yy  2008 3  Dolm  CFO   [("Damien Cruz", "Hello"), ("Lara Dolm", "Nice to meet you")] 

Pour la première rangée, par exemple, je veux vérifier chaque paire clé-valeur si la première entrée de la liste contient le nom de famille, si pas continuer, si oui , prenez la partie de discours (c.-à-d. la deuxième entrée de liste) et stockez-la dans la nouvelle colonne. En tant que tel, je veux l'ensemble de données suivant (j'ai caché le discours initial de colonne ici, mais il devrait toujours être contenu, ainsi je ne veux pas le remplacer, juste crée une nouvelle colonne).

ticker year quarter exel_lname jobposition speechmanager 
xx  2009 1  Angle  CEO   "Thank you" 
xx  2009 1  Barth  CFO   "It is" 
xx  2009 2  Angle  CEO   "I am surprised" 
xx  2009 2  Barth  CFO   "So am I" 
yy  2008 3  Cruz  CEO   "Hello" 
yy  2008 3  Dolm  CFO   "Nice to meet you" 

Quelqu'un pourrait m'aider à résoudre ce problème dans Python 3?

Merci! Julia

Répondre

2

Ceci est peut-être mieux accompli par une fonction d'écriture, puis l'appliquer sage-rangée:

def get_speech(row): 
    matches = list(filter(lambda x: x[0].endswith(row['exel_lname']), row['speech'])) 
    if len(matches) > 0: 
     return matches[0][1] 
    return '' 

df['speechmanager'] = df.apply(get_speech, axis=1) 
+0

Merci! J'ai en quelque sorte obtenu: "('index de la liste hors de portée', 's'est produit à l'index 0')" retour. Peut-être quelque chose comme: def f (L): res1 = defaultdict (liste) pour l'élément en df ["exec_lname"]: pour v, k en L: 1ère approche: nouveau = [k pour k en L si item dans v] 2ème approche: le cas échéant (item dans v pour v dans L): new = list ({clé pour clé, valeur dans res1} .items(). items()) return new df [" speechmanager "] = df [" discours "]. apply (f) ou quelque chose de similaire? Ou pourquoi l'indice de liste pourrait-il être hors limites? – Julia

+0

@Julia l'index '[0]' serait hors de portée si la compréhension de la liste renvoyait une liste vide, dont je n'ai pas pris en compte initialement; J'ai modifié la réponse de sorte que la compréhension retourne le deuxième élément du premier tuple qui correspond, si l'on correspond, ou retourne une chaîne vide s'il n'y a pas de correspondance. – cmaher

+0

Merci - cela fonctionne maintenant pour quelques observations - seulement pour ceux où le premier tuple est aussi celui où l'article [0] se termine par le nom de famille. Si la personne n'est pas le premier locuteur et que son discours apparaît dans un autre tuple, une chaîne vide est renvoyée. Est-il possible de faire en sorte que Python continue de chercher dans tous les tuples? – Julia