2017-02-24 196 views
1

我會盡可能簡化。我有一個DataFrame,其中包含按州列出的業務列表。有些國家是縮寫的,有些則不是。我想用縮寫(例如:新澤西州到新澤西州)替換完整的州名。用字典的值替換字符串

我發現了一個很酷的模塊,「美國」發現here列出在字典中的所有狀態和它們的縮寫。我想要做的是用縮寫代替全名。

代碼:

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

現在,我能夠做的唯一事情是使用一個字符串,並與「國家」代替。我如何用字典中的縮寫替換名稱?我試過並想要類似x= x.replace(x, lst_of_abbrv) 但它錯誤,因爲你顯然不能用dict_keys替換。

加分,如果你能解釋如何將其應用到列「C」的數據幀

+0

'X = x.replace(X,statez [X])'的整列? – BallpointBen

+0

不要將鍵和值分隔到不同的列表中。只要檢查'如果x in statez'。 –

+0

@BallpointBen這是我第一次去,但我得到一個KeyError。 'KeyError異常:「Oklahoma''在我上面 – MattR

回答

2

首先,我將定義一個函數,將取代如果存在任何字符串中的狀態的完整名稱或返回原始字符串。

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 

然後可以應用此功能將數據幀

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

這正是我所尋找的。我會更深入地探討你使用這個解決方案的步驟(主要是'.map'和使用'lambda'。如果我能麻煩你,你有沒有我可以學習的任何文檔或鏈接? – MattR

+1

@ mattr的大熊貓在數據幀列/系列http://pandas.pydata.org/pandas-docs/stable/basics.html#applying-elementwise-python-functions地圖。SO問題與拉姆達使用http://stackoverflow.com /問題/ 890128 /爲什麼 - 是的Python-lambda表達式,有用 – MarkAWard

+0

感謝那些鏈接!我想我明白'.MAP()'。但是你的lambda函數仍然打我......我不明白是怎麼回事工作;尤其是'拉姆達狀態:狀態company'這不是你的工作,勺子餵我,但如果你有時間我會* *大大讚賞任何幫助 – MattR

2

下面是完整的解決方案:

# 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:完成解決方案,你需要的話重新加入到帶「」。加入(字)的短語,然後將其寫入列**Ç **。 – Prune

+0

我感謝您的幫助!我希望我可以給兩個答案。 – MattR