2017-02-24 147 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