list_of_values
muss nicht unbedingt ein list
; es kann sein set
, tuple
, dictionary
numpy array, pandas Series, generator, range
usw. und isin()
y query()
funktioniert trotzdem.
Einige häufige Probleme bei der Auswahl von Zeilen
1. list_of_values
ist ein Bereich
Wenn Sie innerhalb eines Bereichs filtern müssen, können Sie between()
Methode oder query()
.
list_of_values = [3, 4, 5, 6] # a range of values
df[df['A'].between(3, 6)] # or
df.query('3<=A<=6')
2. Rückgabe df
in der Reihenfolge von list_of_values
Im OP werden die Werte in list_of_values
erscheinen nicht in dieser Reihenfolge in df
. Wenn Sie wollen df
in der Reihenfolge zurückzugeben, in der sie in list_of_values
, d.h. "sortieren" nach list_of_values
verwenden loc
.
list_of_values = [3, 6]
df.set_index('A').loc[list_of_values].reset_index()
Wenn Sie den alten Index beibehalten wollen, können Sie folgendes tun.
list_of_values = [3, 6, 3]
df.reset_index().set_index('A').loc[list_of_values].reset_index().set_index('index').rename_axis(None)
3. Verwenden Sie nicht apply
Generell, isin()
y query()
sind die besten Methoden für diese Aufgabe; es besteht keine Notwendigkeit für apply()
. Zum Beispiel, für die Funktion f(A) = 2*A - 5
auf Spalte A
beide isin()
y query()
viel effizienter arbeiten:
df[(2*df['A']-5).isin(list_of_values)] # or
df[df['A'].mul(2).sub(5).isin(list_of_values)] # or
df.query("A.mul(2).sub(5) in @list_of_values")
4. Markieren Sie Zeilen, die nicht in list_of_values
Um Zeilen auszuwählen, die nicht in list_of_values
verneinen isin()
/ in
:
df[~df['A'].isin(list_of_values)]
df.query("A not in @list_of_values") # df.query("A != @list_of_values")
5. Markieren Sie Zeilen, in denen sich mehrere Spalten befinden list_of_values
Wenn Sie nach beiden (oder mehreren) Spalten filtern möchten, gibt es any()
y all()
um Spalten zu reduzieren ( axis=1
) je nach Bedarf.
-
Wählen Sie Zeilen aus, in denen mindestens einer der folgenden Punkte zutrifft A
o B
ist in list_of_values
:
df[df[['A','B']].isin(list_of_values).any(1)]
df.query("A in @list_of_values or B in @list_of_values")
-
Wählen Sie Zeilen aus, in denen beide von A
y B
sind in list_of_values
:
df[df[['A','B']].isin(list_of_values).all(1)]
df.query("A in @list_of_values and B in @list_of_values")
Bonus:
Sie können auch anrufen isin()
innerhalb query()
:
df.query("A.isin(@list_of_values).values")