2017-02-24 22 views
1

できるだけ簡略化します。私は州ごとのビジネスリストを持つDataFrameを持っています。州によっては省略されているものもあれば、そうでないものもある。完全な州名を略語(例えばニュージャージー州のニュージャージー州)に置き換えたいと思います。文字列を辞書の値と置き換えてください

私はクールなモジュール "US"が見つかりました見つかったすべての状態とその略語を辞書に記載しています。私がしたいのは、フルネームを略語に置き換えることです。

コード:私が行うことができるよ

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で置き換えることができないのでエラーとなる。

余分なポイントあなたはここでデータフレーム

+0

'X = x.replace(X、statez [X])'の列全体にこの機能を適用することができますか? – BallpointBen

+0

キーと値を別のリストに分けてはいけません。 'if 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 pandasはデータフレームの列/シリーズhttp://pandas.pydata.org/pandas-docs/stable/basics.html#applying-elementwise-python-functionsにマップしていますので、ラムダの使用法に関する質問http://stackoverflow.com/questions/890128/why-are-python-lambdas-useful – MarkAWard

+0

これらのリンクをありがとう!私は '.map()'を理解していると思うが、あなたのラムダ関数はまだ私を打ち負かす...私はそれがどのように見えない私はあなたに援助を感謝するでしょう。 – MattR

2

の列「C」にこれを適用する方法を説明することができれば完全なソリューションです:

# 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

私は助けに感謝します!私は2つの答えを与えることができたと思います。 – MattR

関連する問題