Ich habe einen Datenrahmen mit Spalten A
, B
. Ich muss eine Spalte C
so erstellen, dass für jeden Datensatz / jede Zeile:
C = max(A, B)
.
Wie soll ich das machen?
Sie können das Maximum wie folgt erhalten:
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})
>>> df
A B
0 1 -2
1 2 8
2 3 1
>>> df[["A", "B"]]
A B
0 1 -2
1 2 8
2 3 1
>>> df[["A", "B"]].max(axis=1)
0 1
1 8
2 3
und so:
>>> df["C"] = df[["A", "B"]].max(axis=1)
>>> df
A B C
0 1 -2 1
1 2 8 8
2 3 1 3
Wenn Sie wissen, dass "A" und "B" die einzigen Spalten sind, könnten Sie sogar damit durchkommen
>>> df["C"] = df.max(axis=1)
Und du könntest es auch gebrauchen .apply(max, axis=1)
, denke ich.
.apply(max, axis=1)
ist viel langsamer als.max(axis=1)
Die Antwort von @ DSM ist in fast jedem normalen Szenario vollkommen in Ordnung. Wenn Sie jedoch ein Programmierer sind, der etwas tiefer als bis zur Oberfläche gehen möchte, könnte es Sie interessieren, dass es etwas schneller ist, Numpy-Funktionen auf dem zugrunde liegenden Array
.to_numpy()
(oder.values
für <0,24) anstatt direkt aufzurufen Aufrufen der (cythonisierten) Funktionen, die für die DataFrame / Series-Objekte definiert sind.Zum Beispiel können Sie
ndarray.max()
entlang der ersten Achse verwenden.Wenn Ihre Daten
NaN
s haben, benötigen Sienumpy.nanmax
:Sie können auch verwenden
numpy.maximum.reduce
.numpy.maximum
ist ein Ufunc (Universal Function) und jeder Ufunc hat einreduce
:np.maximum.reduce
undnp.max
scheinen mehr oder weniger gleich zu sein (für die meisten normal großen DataFrames) - und zufällig einen Schatten schneller alsDataFrame.max
. Ich stelle mir vor, dass dieser Unterschied in etwa konstant bleibt und auf internen Overhead (Indexausrichtung, Umgang mit NaNs usw.) zurückzuführen ist.Der Graph wurde unter Verwendung eines Perfplots erzeugt . Benchmarking-Code als Referenz:
quelle