2016-09-24 5 views
2

Ich habe folgenden Datenrahmen:mehr Bedingungen für np.where Python Pandas

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 

Ich kann den höchsten Wert in jeder Region durch gefunden berechnen:

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

Wenn ich mich nur zwei Populationen vergleichen kann dann die Quelle der höchsten Population berechnen dh:

Allerdings, wenn ich versuche, dies zu erweitern Suche in allen drei Spalten, es funktioniert nicht. Ich habe nach einer Lösung gesucht, aber kann nichts mit np.where funktioniert (np.logical_or oder ähnliches.

Bin ich etwas fehlt offensichtlich?

Antwort

2

fand ich Ihre Frage etwas verwirrend (unter anderem, df.upper_limit == df['upper_limit'] ist immer wahr, und Ihre „Quelle“ Spalten sind alle mit x1 (mit Ausnahme einer 1x, die wie ein Tippfehler aussieht) gefüllt).

aber es scheint, wie Sie die der drei finden möchten Spalten war verantwortlich für das Maximum, dann berechnen Sie einen Wert auf der Grundlage dieser. Also, um die co zu berechnen lumn verantwortlich, könnten Sie np.argmax verwenden:

import numpy as np 

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

Dies wird Ihnen geben, für jede Zeile, 0, 1 oder 2, je nachdem, welche der drei Säulen war für die maximale verantwortlich.

Nun, wenn zum Beispiel Sie möchten, dass pop_1_source, pop_2_source oder pop_3_source wählen, nach dem Index, Sie np.choose verwenden:

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

Sie haben Recht, ein copy/paste Fehler war, habe den df editiert, um den korrekten Quellcode anzuzeigen. Danke für die Antwort, funktioniert perfekt! – DGraham

Verwandte Themen