2017-02-24 4 views
1

Ich werde so viel wie möglich vereinfachen. Ich habe einen DataFrame mit einer Liste von Unternehmen nach Bundesstaat. Einige Staaten sind abgekürzt, andere nicht. Ich möchte den vollen Staatsnamen durch die Abkürzung ersetzen (zB New Jersey bis NJ).Ersetzen String mit Wert des Wörterbuchs

Ich fand ein cooles Modul "US" gefunden here, das alle Zustände und ihre Abkürzungen in einem Wörterbuch auflistet. Ich möchte den vollständigen Namen durch die Abkürzungen ersetzen.

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()) 

Im Augenblick ist das einzige, was ich in der Lage bin, ist eine Zeichenfolge zu tun verwenden und ersetzen Sie es mit dem Wort „Staat“. Wie ersetze ich den Namen durch die Abkürzungen aus dem Wörterbuch? Ich habe versucht und möchte etwas wie x= x.replace(x, lst_of_abbrv) aber es ist fehlerhaft, weil Sie nicht offensichtlich mit dict_keys ersetzen können.

Extra-Punkte, wenn Sie sind in der Lage zu erklären, wie diese von dem Datenrahmen

+0

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

+0

Die Schlüssel und Werte nicht in verschiedene Listen aufteilen. Überprüfen Sie einfach 'if x in statez'. –

+0

@BallpointBen das war meine erste Anlaufstelle, aber ich bekomme einen KeyError. 'KeyError: 'Oklahoma' in meinem speziellen Beispiel über – MattR

Antwort

2

Zuerst würde ich definiere eine Funktion, die ersetzen würde der vollständige Name von Zuständen in einer Zeichenfolge, falls vorhanden, oder Rückgabe der ursprünglichen Zeichenfolge.

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 

dann können Sie diese Funktion auf die gesamte Spalte des Datenrahmen gelten

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

genau das habe ich gesucht. Ich werde mehr in die Schritte gehen, die Sie verwendet haben, um zu dieser Lösung zu kommen (hauptsächlich '.map' und' lambda' zu verwenden. Wenn ich Ihnen Probleme bereiten könnte, haben Sie Dokumentation oder Links, auf denen ich lernen könnte? – MattR

+1

@ Mattr Pandas in einer Datenspalte Spalte/Reihe http://pandas.pydata.org/pandas-docs/stable/basics.html#applying-elementwise-python-funktionen.SO Frage im Zusammenhang mit Lambda-Nutzung http://stackoverflow.com/questions/890128/why-are-python-lambdas-nützlich – MarkAWard

+0

Danke für diese Links! Ich denke, ich verstehe '.map()' Aber deine Lambda-Funktion hat mich immer noch geschlagen ... Ich sehe nicht, wie es ist arbeiten, vor allem "Lambda-Zustand: Staat in der Firma." Es ist nicht Ihre Aufgabe, Löffel mich zu füttern, aber wenn Sie die Zeit haben würde ich * sehr * schätzen jede Hilfe – MattR

2

Dies ist die komplette Lösung zur Spalte „C“ gelten:

# 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: Um die Lösung abzuschließen, müssen Sie die Wörter in die Phrase mit ".join (Wörter) wieder verbinden, und dann in die Spalte ** C **. – Prune

+0

Ich schätze die Hilfe! Ich wünschte, ich könnte zwei beantwortete Schecks geben. – MattR

Verwandte Themen