Zusammenfassung: Verwenden Sie .tolist()
. Verwenden Sie nicht list()
Wenn wir den Quellcode von .tolist()
betrachten, wird unter der Haube die Funktion list()
auf die zugrunde liegenden Daten im DataFrame aufgerufen, daher sollten beide den gleichen Output produzieren.
Aber es scheint, als ob tolist()
für Spalten mit Python-Skalaren optimiert ist, denn ich habe festgestellt, dass das Aufrufen von list()
auf einer Spalte 10 Mal langsamer war als das Aufrufen von tolist()
. Um es festzuhalten, ich habe versucht, eine Spalte mit JSON-Strings in einem sehr großen DataFrame in eine Liste zu konvertieren und list()
hat sich Zeit gelassen. Das hat mich dazu inspiriert, die Laufzeiten der beiden Methoden zu testen.
Zur Info: Es ist nicht notwendig, .to_numpy()
aufzurufen oder das Attribut .values
zu erhalten, da DataFrame-Spalten/Series-Objekte bereits die Methode .tolist()
implementieren. Aufgrund der Art und Weise, wie NumPy-Arrays gespeichert sind, würden list()
und tolist()
verschiedene Arten von Skalaren (mindestens) für numerische Spalten liefern. Zum Beispiel,
type(list(df['budget'].values)[0]) # numpy.int64
type(df['budget'].values.tolist()[0]) # int
Das folgende Perfplot zeigt die Laufzeitunterschiede zwischen den beiden Methoden für verschiedene Pandas-dtype-Series-Objekte. Es zeigt im Grunde die Laufzeitunterschiede zwischen den folgenden zwei Methoden:
list(df['some_col']) # list()
df['some_col'].tolist() # .tolist()
Wie Sie sehen können, unabhängig von der Größe der Spalte/Serie sind für numerische und Objekt-dtype-Spalten/Serien die .tolist()
-Methode viel schneller als list()
. Nicht hier enthalten, aber die Diagramme für Spalten des Dtyps float
und bool
waren sehr ähnlich zu dem des hier gezeigten int
Dtyps. Auch das Diagramm für eine Objekt-Dtyp-Spalte, die Listen enthält, war sehr ähnlich zu dem Diagramm der hier gezeigten String-Spalte. Dtyp-Erweiterungen wie 'Int64Dtype'
, 'StringDtype'
, 'Float64Dtype'
usw. zeigten ähnliche Muster.
Andererseits gibt es praktisch keinen Unterschied zwischen den beiden Methoden für datetime
, timedelta
und Categorical
-Dtyp-Spalten.
Verwendeter Code zur Erstellung des obigen Plots:
from perfplot import plot
kernels = [lambda s: list(s), lambda s: s.tolist()]
labels = ['list()', '.tolist()']
n_range = [2**k for k in range(4, 20)]
xlabel = 'Zeilen im DataFrame'
eq_chk = lambda x,y: all([x,y])
numeric = lambda n: pd.Series(range(5)).repeat(n)
string = lambda n: pd.Series(['ein Wort', 'ein anderes Wort', 'ein Wort']).repeat(n)
datetime = lambda n: pd.to_datetime(pd.Series(['2012-05-14', '2046-12-31'])).repeat(n)
timedelta = lambda n: pd.to_timedelta(pd.Series([1,2]), unit='D').repeat(n)
categorical = lambda n: pd.Series(pd.Categorical([1, 2, 3, 1, 2, 3])).repeat(n)
for n, f in [('Numerisch', numeric), ('Objekt Dtyp', string),
('Datetime', datetime), ('Timedelta', timedelta),
('Kategorisch', categorical)]:
plot(setup=f, kernels=kernels, labels=labels, n_range=n_range,
xlabel=xlabel, title=f'Spalte {n}', equality_check=eq_chk);