2015-04-28 10 views
42

Ho un dataframe come questo:Trova il nome della colonna che ha il massimo valore per ogni riga

In [7]: 
frame.head() 
Out[7]: 
Communications and Search Business General Lifestyle 
0 0.745763 0.050847 0.118644 0.084746 
0 0.333333 0.000000 0.583333 0.083333 
0 0.617021 0.042553 0.297872 0.042553 
0 0.435897 0.000000 0.410256 0.153846 
0 0.358974 0.076923 0.410256 0.153846 

Qui, voglio chiedere come ottenere nome della colonna che ha il massimo valore per ogni riga, l'uscita desiderata è così:

In [7]: 
    frame.head() 
    Out[7]: 
    Communications and Search Business General Lifestyle Max 
    0 0.745763 0.050847 0.118644 0.084746   Communications 
    0 0.333333 0.000000 0.583333 0.083333   Business 
    0 0.617021 0.042553 0.297872 0.042553   Communications 
    0 0.435897 0.000000 0.410256 0.153846   Communications 
    0 0.358974 0.076923 0.410256 0.153846   Business 

risposta

62

È possibile utilizzare idxmax con axis=1 per trovare la colonna con il valore più grande su ogni riga:

>>> df.idxmax(axis=1) 
0 Communications 
1   Business 
2 Communications 
3 Communications 
4   Business 
dtype: object 

Per creare la nuova colonna 'Max', utilizzare df['Max'] = df.idxmax(axis=1).

per trovare la riga dell'indice in cui il valore massimo si verifica in ciascuna colonna, utilizzare df.idxmax() (o equivalentemente df.idxmax(axis=0)).

+1

Come posso ottenere la seconda massimo? Volevo le 3 migliori probabilità quindi ... –

+0

@SushantKulkarni, Controlla la mia risposta di seguito –

+0

@SushantKulkarni Come sei riuscito a ottenere le prime 3 probabilità anziché la prima posizione? – Stergios

2

si potrebbe apply su dataframe e ricevere argmax() di ciascuna riga tramite axis=1

In [144]: df.apply(lambda x: x.argmax(), axis=1) 
Out[144]: 
0 Communications 
1   Business 
2 Communications 
3 Communications 
4   Business 
dtype: object 

Ecco un punto di riferimento per confrontare quanto lento apply metodo è quello di idxmax() per len(df) ~ 20K

In [146]: %timeit df.apply(lambda x: x.argmax(), axis=1) 
1 loops, best of 3: 479 ms per loop 

In [147]: %timeit df.idxmax(axis=1) 
10 loops, best of 3: 47.3 ms per loop 
5

E se si vuole produrre una colonna contenente il nome della colonna con il valore massimo ma considerando solo un sottoinsieme di colonne quindi si utilizza una variante del @ di AJCR risposta:

df['Max'] = df[['Communications','Business']].idxmax(axis=1) 
Problemi correlati