2016-09-24 91 views
2

我有以下數據框:多個條件

region pop_1 pop_1_source pop_2 pop_2_source pop_3 pop_3_source 
a 99 x1 84 x2 61 x3 
b 64 x1 65 x2 16 x3 
c 92 x1 26 x2 6 x3 
d 82 x1 60 x2 38 x3 
e 45 x1 77 x2 42 x3 

我可以通過計算每個區域發現的最高值:

df['upper_limit'] = df[['pop_1','pop_2','pop_3']].max(axis=1) 

如果我只是比較兩個羣體我然後可以計算最高人口的來源,即:

df['upper_limit_source'] = np.where(df.upper_limit == df['upper_limit'],df.pop_1,df.pop_2) 

但是,如果我嘗試擴展到搜索所有三列,它無法工作。 我已經尋找一個解決方案,但不能做任何事np.where工作(np.logical_or或相似。

我失去了一些東西明顯?

回答

2

,我發現你的問題有點混亂(除其他事項外, df.upper_limit == df['upper_limit']始終是真實的,而你的「來源」欄都充滿x1(除了一個1x它看起來像一個錯字))。

但是,好像你想找到的三其中列負責最大值,然後根據這個值計算一個值。因此,要計算co lumn負責,你可以使用np.argmax

import numpy as np 

idmax = np.argmax(df[['pop_1','pop_2','pop_3']].as_matrix(), axis=1) 

這會給你,對於每一行,0,1或2,這取決於三列的負責最大值。

現在如果,例如,你想選擇pop_1_sourcepop_2_source,或pop_3_source,根據索引,你可以使用np.choose

np.choose(idmax, df[[`pop_1_source', 'pop_2_source', pop_3_source']].as_matrix().T) 
+0

你是對的,是一個複製/粘貼錯誤,編輯了df以顯示正確的源代碼。感謝您的答案,完美的作品! – DGraham