3
votes

comment remplacer tous les mots des phrases d'une colonne pandas par des nombres d'un dictionnaire, puis les additionner?

J'ai le dataframe suivant

def replace_words(s, words):
    for k, v in words.items():
        s = s.replace('^'k+'$', v, regex=True)
    return s

et j'ai le dictionnaire suivant dc = dict ({'bad': - 1, 'good': 1, 'better': 2, 'pire': - 3, 'horrible': - 5})

Je voudrais remplacer tous les mots du col par les nombres qui correspond à ce mot du dc puis additionne les nombres.

J'ai d'abord essayé le remplacement en utilisant

import pandas as pd
df = pd.DataFrame({'col': ['bad good better three worst', 'awful best one']})

df ['col'] = df ['col']. apply (lambda x: [replace_words (i, dc) for i in x.split ('')])

mais cela ne fonctionne pas.

Des idées?


0 commentaires

3 Réponses :


3
votes

Vous pouvez utiliser series.str.findall () pour trouver tous les mots correspondants dans la chaîne et en utilisant get () remplacez la liste de mots par des valeurs dict:

df.col.str.findall('|'.join(dc.keys())).apply(lambda x: [dc.get(i,i) for i in x])
0    [-1, 1, 2, -3]
1              [-5]
Name: col, dtype: object


0 commentaires

4
votes

cela devrait fonctionner

0   -1
1   -5

Sortie

df.col.apply(lambda x: sum([dc.get(i) if dc.get(i) else 0 for i in x.split()]))


Remarque : si le mot n'est pas trouvé dans dc alors en utilisant la valeur 0 à la place, recommandez s'il en est autrement car il n'est pas mentionné


0 commentaires

4
votes

Utilisez la compréhension de liste avec get pour les valeurs de recherche avec la valeur par défaut 0 et sum:

print ([list(dc.get(x, 0) for x in i.split()) for i in df['col']])
[[-1, 1, 2, 0, -3], [-5, 0, 0]]

Une autre solution pour les valeurs de test dans dict avec in :

df['col'] = [sum(dc.get(x) for x in i.split() if x in dc) for i in df['col']]

df['col'] = [sum(dc.get(x, 0) for x in i.split()) for i in df['col']]
print (df)
   col
0   -1
1   -5


0 commentaires