2016-04-23 14 views
0

Ich versuche, eine neue Serie von einem DataFrame zu bekommen. Diese Serie sollte die Spaltennamen der DataFrame-Werte enthalten, die für jede Zeile des DataFrames über einem bestimmten Wert liegen. Aber beginnend von der linken Seite der Datenrahmen, wie folgt aus:Pandas Series mit Spaltennamen für jeden Wert über einem Minimum

df = pd.DataFrame(np.random.randint(0,10,size=(5, 6)), columns=list('ABCDEF')) 

>>> df 

    A B C D E F 
0 2 4 6 8 8 4 
1 2 0 9 7 7 1 
2 1 7 7 7 3 0 
3 5 4 4 0 1 7 
4 9 6 1 5 1 5 


min = 3 

Erwartete Ausgabe:

0 B 
1 C 
2 B 
3 A 
4 A 
dtype: object 

Hier die Zeile des Ausgangs 0 ist „B“, weil in der Dataframe Zeilenindex 0 Spalte „B“ die linke Spalte, die einen Wert hat, der gleich oder größer als min = 3 ist.

Ich weiß, dass ich df.idxmin(axis = 1) verwende, um die Spaltennamen des Minimums für jede Zeile zu erhalten, aber ich habe jetzt Ahnung, wie man dieses komplexere Problem anpackt.

Vielen Dank für Hilfe oder Hinweise!

+1

Könnten Sie bitte Ihre erwartete Ausgabe überarbeiten? Für die Zeile = 0 sollte es "B" sein (9> = 3 und ist die am weitesten links stehende>> = 3), für "Zeile = 1" -> "A", "Zeile = 2" -> 'A' ??? – MaxU

+0

Oh, etwas ging schief. Sie haben natürlich Recht, ich habe sowohl den Datenrahmen als auch die erwartete Ausgabe bearbeitet. Es tut uns leid. – smiss

Antwort

1

UPDATE - Index des ersten Elements in jeder Reihe, erfüllt Bedingung:

elegantere und effizientere Version von @DSM:

In [156]: (df>=3).idxmax(1) 
Out[156]: 
0 B 
1 C 
2 B 
3 A 
4 A 
dtype: object 

meine Version:

In [149]: df[df>=3].apply(lambda x: x.first_valid_index(), axis=1) 
Out[149]: 
0 B 
1 C 
2 B 
3 A 
4 A 
dtype: object 

Alte Antwort - Index des minimalen Elements für jede Zeile:

In [27]: df[df>=3].idxmin(1) 
Out[27]: 
0 E 
1 A 
2 C 
3 C 
4 F 
dtype: object 
+0

Danke, aber das gibt das Minimum jeder Zeile, für alle Werte> = 3 soweit ich sehe. Es sieht nicht von links aus, den Wert aus der linken Spalte zu nehmen, die> = 3 ist, oder? – smiss

+0

@smiss, ich habe meine Antwort aktualisiert - bitte überprüfen Sie – MaxU

+0

Können wir nicht einfach '(df> = 3) .idxmax (axis = 1)' '? (Beachten Sie, dass ich beim ersten Mal versehentlich 'min' anstelle von' max' eingegeben habe.) – DSM

Verwandte Themen