2017-10-13 1 views
0

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.

Répondre

0

essayer .str et map:

names_series = df['persons_name'] 
name_mapping = None 

while True: 
    name_series = name_series.str.partition() 
    mapping = name_series[0].map(name_dict) 
    if name_mapping is None: 
     name_mapping = mapping 
    else: 
     name_mapping[name_mapping.isnull() & (~mapping.isnull())]=mapping 
    name_series = name_series[2] 
    if name_series.str.len().sum()==0: 
     break 

name_series[name_series.isnull()] = 'UNMAPPED' 
df['bew_col'] = name_series 
+0

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! –

+0

@Oshin Patwa, sont les mots de nom toujours moins de 3? – Ian

+0

@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? –