Warum spricht niemand über die Leistung verschiedener Filtermethoden? Tatsächlich taucht dieses Thema hier oft auf (siehe Beispiel). Ich habe meinen eigenen Leistungstest für einen großen Datensatz gemacht. Es ist sehr interessant und lehrreich.
df = pd.DataFrame({'animals': np.random.choice(['cat', 'dog', 'mouse', 'birds'], size=10**7),
'number': np.random.randint(0,100, size=(10**7,))})
df.info()
RangeIndex: 10000000 entries, 0 to 9999999
Data columns (total 2 columns):
# Column Dtype
--- ------ -----
0 animals object
1 number int64
dtypes: int64(1), object(1)
memory usage: 152.6+ MB
%%timeit
# .isin() nach einer Spalte
conditions = ['cat', 'dog']
df[df.animals.isin(conditions)]
367 ms ± 2.34 ms pro Schleife (mean ± std. dev. von 7 Schleifen, 1 Schleife pro Durchlauf)
%%timeit
# .query() nach einer Spalte
conditions = ['cat', 'dog']
df.query('animals in @conditions')
395 ms ± 3.9 ms pro Schleife (mean ± std. dev. von 7 Schleifen, 1 Schleife pro Durchlauf)
%%timeit
# .loc[]
df.loc[(df.animals=='cat')|(df.animals=='dog')]
987 ms ± 5.17 ms pro Schleife (mean ± std. dev. von 7 Schleifen, 1 Schleife pro Durchlauf)
%%timeit
df[df.apply(lambda x: x['animals'] in ['cat', 'dog'], axis=1)]
41.9 s ± 490 ms pro Schleife (mean ± std. dev. von 7 Schleifen, 1 Schleife pro Durchlauf)
%%timeit
new_df = df.set_index('animals')
new_df.loc[['cat', 'dog'], :]
3.64 s ± 62.5 ms pro Schleife (mean ± std. dev. von 7 Schleifen, 1 Schleife pro Durchlauf)
%%timeit
new_df = df.set_index('animals')
new_df[new_df.index.isin(['cat', 'dog'])]
469 ms ± 8.98 ms pro Schleife (mean ± std. dev. von 7 Schleifen, 1 Schleife pro Durchlauf)
%%timeit
s = pd.Series(['cat', 'dog'], name='animals')
df.merge(s, on='animals', how='inner')
796 ms ± 30.9 ms pro Schleife (mean ± std. dev. von 7 Schleifen, 1 Schleife pro Durchlauf)
Somit stellte sich heraus, dass die Methode isin
die schnellste und die Methode mit apply()
die langsamste war, was nicht überraschend ist.