Je dois traiter une colonne d'une trame de données d'une taille approximative de 15k à 20K. Je dois traiter la colonne « nom » dans pour que j'ai appelé df.applyOptimisation de l'intersection entre la liste et les clés de dictionnaire vraiment volumineuses
df['bew_col']=df.apply(lambda row: valuation_formula(row['persons_name']), axis=1)
def valuation_formula(name_str):
flag='UNMAPPED'
sr=name_str.split(' ')
f=list(set(sr).intersection(set(name_dict.keys())))
# print (f)
if len(f)>0:
flag=name_dict[str(f[0])]
# print flag
return flag
mon name_dict est un dictionnaire avec 5 millions de clés. comment puis-je optimiser mon code pour faire une intersection efficace d'une liste de chaînes (ce qui serait petit donc pas un souci) avec des clés dans cet énorme dictionnaire pour retourner la valeur correspondante pour la clé correspondante?
Puis-je utiliser n'importe quelle autre structure de données?
maintenant le script prend 20 min à courir. avec une taille df de 10k et une taille name_dict de 3 millions.
merci pour votre réponse, mais je ne peux pas exécuter l'instruction name_series = df [ ''] persons_name str.partition (» «) [0] directement alors que le premier. le nom de la chaîne serait considerd (par exemple Oshin Sanjay Patwa) ici il ne mappera que pour Oshin et pas 'Sanjay' 'Patwa' je veux vérifier la présence de tous les mots de la chaîne dans name_dict.keys(), donc je pourrais utiliser la fonction map dans ma fonction valuation_formula comme: f = liste (set (sr) .map (name_dict.keys()) Merci pour votre suggestion! –
@Oshin Patwa, sont les mots de nom toujours moins de 3? – Ian
@lan hey non pas toujours je t varie mais oui je peux trouver la chaîne avec le nombre maximum de mots dans ce cas de la colonne 'nom' de la trame de données serait-il utiliser alors plein? –