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?
3 Réponses :
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
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é
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