1322 Stimmen

Verwenden Sie eine Liste von Werten, um Zeilen aus einem Pandas-Datenframe auszuwählen

Nehmen wir an, ich habe den folgenden Pandas-Datenrahmen:

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
df

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

Ich kann eine Untergruppe auf der Grundlage eines bestimmten Wertes bilden:

x = df[df['A'] == 3]
x

     A   B
2    3   3

Aber wie kann ich eine Untergruppe auf der Grundlage einer Liste von Werten bilden? - etwas wie dies:

list_of_values = [3,6]

y = df[df['A'] in list_of_values]

Zu bekommen:

     A    B
1    6    2
2    3    3

2185voto

Wouter Overmeire Punkte 63916

Sie können die isin Methode:

In [1]: df = pd.DataFrame({'A': [5,6,3,4], 'B': [1,2,3,5]})

In [2]: df
Out[2]:
   A  B
0  5  1
1  6  2
2  3  3
3  4  5

In [3]: df[df['A'].isin([3, 6])]
Out[3]:
   A  B
1  6  2
2  3  3

Um das Gegenteil zu erreichen, verwenden Sie ~ :

In [4]: df[~df['A'].isin([3, 6])]
Out[4]:
   A  B
0  5  1
3  4  5

96voto

Mykola Zotko Punkte 11977

Sie können die Methode Abfrage :

df.query('A in [6, 3]')
# df.query('A == [6, 3]')

o

lst = [6, 3]
df.query('A in @lst')
# df.query('A == @lst')

20voto

not a robot Punkte 3525

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.

  1. 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")
  2. 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")

12voto

svp Punkte 1554

Sie können Ihre Werte in einer Liste speichern als:

lis = [3,6]

dann

df1 = df[df['A'].isin(lis)]

10voto

Achintha Ihalage Punkte 2176

Eine andere Methode;

df.loc[df.apply(lambda x: x.A in [3,6], axis=1)]

Anders als die isin Methode ist dies besonders nützlich, um festzustellen, ob die Liste eine Funktion der Spalte A . Zum Beispiel, f(A) = 2*A - 5 als die Funktion;

df.loc[df.apply(lambda x: 2*x.A-5 in [3,6], axis=1)]

Es ist zu beachten, dass dieser Ansatz langsamer ist als die isin Methode.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X