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 

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)).


@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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.