Suchen Sie den Spaltennamen mit dem Maximalwert für jede Zeile

121

Ich habe einen DataFrame wie diesen:

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

Hier möchte ich fragen, wie man einen Spaltennamen erhält, der für jede Zeile den Maximalwert hat. Die gewünschte Ausgabe lautet wie folgt:

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 
Markov Zain
quelle

Antworten:

163

Sie können verwendet werden idxmaxmit axis=1der Säule mit dem größten Wert in jeder Zeile zu finden:

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

Verwenden Sie zum Erstellen der neuen Spalte 'Max' df['Max'] = df.idxmax(axis=1).

Zu finden , um die Zeile , an dem Index der Maximalwert in jeder Spalte auftritt, verwenden df.idxmax()(oder äquivalent df.idxmax(axis=0)).

Alex Riley
quelle
@SushantKulkarni Wie haben Sie es geschafft, die Top-3-Wahrscheinlichkeiten anstelle der Top-1 zu erhalten?
Stergios
# Berechnen von Wahrscheinlichkeiten für alle Konten proba = lr.predict_proba (tfidf) MLR_y_p = pd.DataFrame (proba, Spalten = np.unique (y), index = df.Key.tolist ())
Sushant Kulkarni
24

Wenn Sie eine Spalte erstellen möchten, die den Namen der Spalte mit dem Maximalwert enthält, aber nur eine Teilmenge der Spalten berücksichtigt, verwenden Sie eine Variation der Antwort von @ ajcr:

df['Max'] = df[['Communications','Business']].idxmax(axis=1)
user1718097
quelle
5
Wenn Sie alle Spalten mit Ausnahme einer Teilmenge ausschließen möchtendf['Max'] = df[df.columns.difference(['Foo','Bar'])].idxmax(axis=1)
Floatingpurr
9

Sie könnten applyauf Datenrahmen und argmax()von jeder Zeile über bekommenaxis=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

Hier ist ein Benchmark , wie langsam zu vergleichen applyMethode ist idxmax()fürlen(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
Null
quelle