2017-07-26 18 views
2

を使用するのdictを決定した場合に使用して、別の列の値に基づいて、列のデータをマッピングここパンダは、私は、次のデータフレーム持っ

state_map = {'CT': 'Connecticut', 'FL': 'Florida', 'TX':'Texas'} 
state_map2 = {'CT': 'ABC-CT', 'FL': 'BBC-Florida', 'TX':'CDA-TX'} 

をするものですデータは次のようになります。

Name State Year 
0 Person1 CT 2017 
1 Person2 FL 2017 
2 Person3 TX 2017 
3 Person1 TX 2016 

if conditiを使用して値をマップした新しい列を追加する方法を知りたいのですがonは、state_mapまたはstate_map2からマップされた値を使用するかどうかを決定します。したがって、df [df ['Name'] == 'Person1']の場合はstate_mapを使用し、それ以外の場合はstate_map2を使用します。

最終的な出力は次のようになります。

Name State Year New_State_Name 
0 Person1 CT 2017 Connecticut 
1 Person2 FL 2017 BBC-Florida 
2 Person3 TX 2017 CDA-TX 
3 Person1 TX 2016 Texas 

私は、次のコードを試みたが、それは動作しませんでした。

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, 
a.bool(), a.item(), a.any() or a.all(). 

答えて

1

を使用np.where

df['New_State_Name'] = np.where(df['Name']=='Person1',df['State'].map(state_map),df['State'].map(state_map2)) 

出力:私が言うエラーまし

df['New_State_Name'] = [state_map[x] if df[df['Name'] == 'Person1'] else 
state_map2[x] for x in df['State']] 

 Name State Year New_State_Name 
0 Person1 CT 2017 Connecticut 
1 Person2 FL 2017 BBC-Florida 
2 Person3 TX 2017   CDA-TX 
3 Person1 TX 2016   Texas 
+0

おかげで、これはあまり行うことが簡単で、それでしたうまくいく!私はちょうど興味があった、私の論理は、リストの理解の中でif条件を使用しようとすると間違っていましたか? – Tony

+0

リストをif文の値と比較すると、あいまいなエラーが発生します。このリストの一部がTrueを返し、partが何をするかわからない場合、Falseを返します。したがって、any()やall()のような別のメソッドを使う必要があります。これは、リストのany()の部分がTrueまたはリストのすべての要素がTrueになる場合にロジックになります。 –

+0

ありがとうございました! – Tony

関連する問題