2016-09-24 30 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 

私はを通じて各地域で見つかった最高値を計算することができます。私は2つの集団を比較した場合

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

をI最高人口の出所を計算することができます:

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

しかし、これを展開しようとすると3つの列すべてを検索すると、機能しません。 は私が解決策で検索しましたが、何かがnp.whereで動作させることはできません(np.logical_orまたは類似。

が、私は明らかに何かが足りないのですか?

答えて

2

私はあなたの質問を見つけとりわけ混乱ビット(、 df.upper_limit == df['upper_limit']常にtrueで、あなたの「ソース」列はすべて)(タイプミスのように見える1 1xを除く)x1で満たされている。しかし

、次の3つのどのを見つけるしたいようにそれはそう列が最大の原因であった場合は、これに基づいて値を計算します。したがって、責任lumn、あなたがnp.argmaxを使用することができます。

import numpy as np 

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

これは、行ごとに、あなたを与える0、1、または2、最大を担当した3つの列のかに依存します。今

たとえば、あなたが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