2017-07-26 19 views
2

我有以下的數據幀從另一列值映射列數據數據的模樣:大熊貓基於使用,如果確定哪些快譯通使用

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

我想找到一種方法,以添加值的新列映射的使用決定是否使用從state_map或state_map2映射的值。所以如果df [df ['Name'] =='Person1'],那麼使用state_map else use 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 

我嘗試下面的代碼,但沒有奏效。

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

我得到了一個錯誤,指出:

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

輸出:

 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語句中的值時發生Ambigous錯誤,那麼如果此列表的一部分返回True且部分返回False,如果不知道該怎麼做,該怎麼辦?因此,如果列表的any()部分導致True或列表True中的所有元素,則必須使用另一種方法(如any()或all()),從而生成邏輯。 –

+0

謝謝你的幫助! – Tony