2017-02-24 1 views
1

Je vais simplifier autant que possible. J'ai un DataFrame avec une liste d'entreprises par état. Certains États sont abrégés, d'autres non. Je veux remplacer le nom d'état complet par l'abréviation (ex: New Jersey à NJ).Remplacer la chaîne par la valeur du dictionnaire

J'ai trouvé un module cool "US" trouvé here qui liste tous les états et leurs abréviations dans un dictionnaire. Ce que je voudrais faire est de remplacer le nom complet par les abréviations.

code:

import pandas as pd 
import numpy as np 
import us 
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
        'C' : ['Pharmacy of Oklahoma','NY Pharma','NJ Pharmacy','Idaho Rx','CA Herbals','Florida Pharma','AK RX','Ohio Drugs','PA Rx','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 
print(dfp) 

statez = us.states.mapping('abbr', 'name') 
lst_of_abbrv = statez.keys() 
lst_of_states = statez.values() 

phrase = "Pharmacy of Oklahoma" 

for x in phrase.split(): 
    if x in lst_of_states: 
     x= x.replace(x, 'State') 
     print(phrase.split()) 

En ce moment, la seule chose que je peux faire est d'utiliser une chaîne et le remplacer par le mot « Etat ». Comment puis-je remplacer le nom avec les abréviations du dictionnaire? J'ai essayé et je veux quelque chose comme x= x.replace(x, lst_of_abbrv) mais il erreurs parce que vous ne pouvez évidemment pas remplacer par dict_keys.

points supplémentaires si vous êtes en mesure d'expliquer comment appliquer cette à la colonne « C » du dataframe

+0

'x = x.replace (x, statez [x])'? – BallpointBen

+0

ne sépare pas les clés et les valeurs dans une liste différente. Il suffit de cocher 'if x in statez'. –

+0

@BallpointBen c'était mon premier go-to, mais je reçois un KeyError. 'KeyError: 'Oklahoma'' dans mon exemple spécifique ci-dessus – MattR

Répondre

2

D'abord, je définir une fonction qui remplacerait le nom complet des états dans une chaîne s'il en existe ou retourner la chaîne d'origine.

def replace_states(company): 
    # find all states that exist in the string 
    state_found = filter(lambda state: state in company, statez.keys()) 

    # replace each state with its abbreviation 
    for state in state_found: 
     company = company.replace(state, statez[state]) 
    # return the modified string (or original if no states were found) 
    return company 

alors vous pouvez appliquer cette fonction à l'ensemble de la colonne de la trame de données

dfp['C'] = dfp['C'].map(replace_states) 
+0

c'est exactement ce que je cherchais. Je regarderai plus en détail les étapes que vous avez utilisées pour arriver à cette solution (principalement '.map' et en utilisant' lambda'.) Si je pouvais vous déranger, avez-vous de la documentation ou des liens sur lesquels je pourrais apprendre quelque chose? – MattR

+1

@ Carte des pandas de MattR dans une colonne/série de données: http://pandas.pydata.org/pandas-docs/stable/basics.html#applying-elementwise-python-functions.Souble question relative à l'utilisation de lambda http://stackoverflow.com/questions/890128/pourquoi-sont-python-lambdas-utile – MarkAWard

+0

Merci pour ces liens! Je crois que je comprends '.map()'. Mais votre fonction lambda m'a encore battu ... Je ne vois pas comment c'est travailler, en particulier '' lambda state: state in company'. Ce n'est pas votre travail de me nourrir, mais si vous avez le temps j'apprécierais * grandement * toute aide – MattR

2

Voici la solution complète:

# Note the difference here 
statez = us.states.mapping('name', 'abbr') 
lst_of_states = statez.keys() 
lst_of_abbrv = statez.values() 

def sentence_with_states_abbreviated(phrase): 
    words = phrase.split() 
    for (i,word) in enumerate(words): 
     if word in lst_of_states: 
      words[i] = statez[word] 
    return ' '.join(words) 

dfp['C'] = dfp['C'].apply(sentence_with_states_abbreviated) 
+1

@MattR: pour compléter la solution, vous devrez joindre les mots dans la phrase avec '' .join (mots), puis mettre dans la colonne ** C **. – Prune

+0

J'apprécie l'aide! J'aimerais pouvoir donner deux vérifications vérifiées. – MattR