2016-06-05 5 views
3

Ich habe ein Pandas Dataframe mit einer Wahrscheinlichkeit für jede Spalte und ich habe 10 Spalten. Zeile repräsentiert einen Datensatz. Ich möchte die 3 besten Wahrscheinlichkeiten auswählen und die Spaltennamen zurückgeben (ähnlich wie argmax).Wie finden Sie die Top 3 Wahrscheinlichkeiten aus 10 Spalten hintereinander in Pandas DataFrame?

Da ich eine große Anzahl von Zeilen habe, möchte ich hoffentlich keine Schleife verwenden. Könnte mir jemand dabei helfen?

Die Datenrahmen sieht wie folgt aus:

col0 col1 col2 col3 col4 col5 col6 col7 col8 col9  
0 0.089659 0.0 0.0 0.0 0.228481 0.000000 0.0 0.575523 0.0 0.089667  
1 0.000000 0.0 0.0 0.0 0.000000 0.422125 0.0 0.516324 0.0 0.000000  
2 0.000000 0.0 0.0 0.0 0.000000 0.304416 0.0 0.659216 0.0 0.000000  
3 0.598459 0.0 0.0 0.0 0.100792 0.082668 0.0 0.144577 0.0 0.053502  
4 0.100000 0.1 0.1 0.1 0.100000 0.100000 0.1 0.100000 0.1 0.100000  
+0

Können Sie ein Beispiel Ihrer Datenrahmen zur Verfügung stellen? –

+0

danke für die frage, karasinsk! Ich habe meinen Beispieldatenrahmen hinzugefügt – user3368526

+0

Könnten Sie auch eine gewünschte Ausgabe/Ergebnismenge veröffentlichen? – MaxU

Antwort

0

Sie in nlargest aussehen sollte. Dies könnte genug sein, um Sie gehen:

df.T.nlargest(3, df.T.columns).T 
+0

@ downvoters, könnten Sie bitte erklären, warum wurde es downvoted? – MaxU

2

Angesichts der df

df 
Out[145]: 
     col0 col1 col2 col3  col4  col5 col6  col7 col8 \ 
0 0.089659 0.0 0.0 0.0 0.228481 0.000000 0.0 0.575523 0.0 
1 0.000000 0.0 0.0 0.0 0.000000 0.422125 0.0 0.516324 0.0 
2 0.000000 0.0 0.0 0.0 0.000000 0.304416 0.0 0.659216 0.0 
3 0.598459 0.0 0.0 0.0 0.100792 0.082668 0.0 0.144577 0.0 
4 0.100000 0.1 0.1 0.1 0.100000 0.100000 0.1 0.100000 0.1 

     col9 
0 0.089667 
1 0.000000 
2 0.000000 
3 0.053502 
4 0.100000 

Sie nlargest verwenden können:

import numpy as np 

x=pd.DataFrame(df).T 

rslt = pd.DataFrame(np.zeros((0,3)), columns=['top1','top2','top3']) 
for i in x.columns: 
    df1row = pd.DataFrame(x.nlargest(3, i).index.tolist(), index=['top1','top2','top3']).T 
    rslt = pd.concat([rslt, df1row], axis=0) 

print rslt 

    top1 top2 top3 
0 col7 col4 col9 
0 col7 col5 col0 
0 col7 col5 col0 
0 col0 col7 col4 
0 col0 col1 col2 
+1

was für eine schöne Antwort. – Aaron

+0

@ToussaintLouverture, Vielen Dank für die Antwort! Ich bin geschmeichelt! – MaThMaX