Wählen Sie Zeilen aus einem DataFrame aus, die auf Werten in einer Spalte in Pandas basieren

Wie wähle man Zeilen aus einem DataFrame aus, die auf Werten in einer Spalte in Pandas basieren?
In SQL würde ich verwenden:

select * from table where colume_name = some_value. 

Ich habe versucht, auf Pandas Dokumentation zu schauen, aber nicht sofort die Antwort gefunden.

9 Solutions collect form web for “Wählen Sie Zeilen aus einem DataFrame aus, die auf Werten in einer Spalte in Pandas basieren”

Um Zeilen auszuwählen, deren Spaltenwert gleich einem Skalar, some_value , verwenden Sie == :

 df.loc[df['column_name'] == some_value] 

Um Zeilen auszuwählen, deren Spaltenwert in einem iterable, some_values , verwenden Sie isin :

 df.loc[df['column_name'].isin(some_values)] 

Kombinieren Sie mehrere Bedingungen mit & :

 df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)] 

Um Zeilen auszuwählen, deren Spaltenwert nicht gleichwertig some_value , verwenden Sie != :

 df.loc[df['column_name'] != some_value] 

isin gibt eine boolesche Serie zurück, um so Zeilen auszuwählen, deren Wert nicht in some_values , die Boolesche Serie mit ~

 df.loc[~df['column_name'].isin(some_values)] 

Beispielsweise,

 import pandas as pd import numpy as np df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(), 'B': 'one one two three two two one three'.split(), 'C': np.arange(8), 'D': np.arange(8) * 2}) print(df) # ABCD # 0 foo one 0 0 # 1 bar one 1 2 # 2 foo two 2 4 # 3 bar three 3 6 # 4 foo two 4 8 # 5 bar two 5 10 # 6 foo one 6 12 # 7 foo three 7 14 print(df.loc[df['A'] == 'foo']) 

Erträge

  ABCD 0 foo one 0 0 2 foo two 2 4 4 foo two 4 8 6 foo one 6 12 7 foo three 7 14 

Wenn du mehrere Werte hast, die du einschließen möchtest, stelle sie in eine Liste (oder allgemeiner irgendwelche iterable) und benutze isin :

 print(df.loc[df['B'].isin(['one','three'])]) 

Erträge

  ABCD 0 foo one 0 0 1 bar one 1 2 3 bar three 3 6 6 foo one 6 12 7 foo three 7 14 

Beachten Sie jedoch, dass, wenn Sie dies viele Male tun wollen, ist es effizienter, einen Index zuerst zu machen, und dann verwenden Sie df.loc :

 df = df.set_index(['B']) print(df.loc['one']) 

Erträge

  ACD B one foo 0 0 one bar 1 2 one foo 6 12 

Oder, um mehrere Werte aus dem Index zu verwenden, verwenden Sie df.index.isin :

 df.loc[df.index.isin(['one','two'])] 

Erträge

  ACD B one foo 0 0 one bar 1 2 two foo 2 4 two foo 4 8 two bar 5 10 one foo 6 12 

Tl; dr

Die Pandas entsprechen

 select * from table where column_name = some_value 

Ist

 table[table.column_name == some_value] 

Mehrere Bedingungen:

 table((table.column_name == some_value) | (table.column_name2 == some_value2)) 

oder

 table.query('column_name == some_value | column_name2 == some_value2') 

Codebeispiel

 import pandas as pd # Create data set d = {'foo':[100, 111, 222], 'bar':[333, 444, 555]} df = pd.DataFrame(d) # Full dataframe: df # Shows: # bar foo # 0 333 100 # 1 444 111 # 2 555 222 # Output only the row(s) in df where foo is 222: df[df.foo == 222] # Shows: # bar foo # 2 555 222 

In dem obigen Code ist es die Zeile df[df.foo == 222] , die die Zeilen auf der Grundlage des Spaltenwerts, 222 in diesem Fall gibt.

Mehrere Bedingungen sind auch möglich:

 df[(df.foo == 222) | (df.bar == 444)] # bar foo # 1 444 111 # 2 555 222 

Aber an diesem Punkt würde ich empfehlen, die Abfrage-Funktion, da es weniger ausführlich ist und liefert das gleiche Ergebnis:

 df.query('foo == 222 | bar == 444') 

Ich finde die Syntax der vorherigen Antworten, um redundant und schwer zu merken. Pandas stellte die Methode query() in v0.13 vor und ich bevorzuge es sehr. Für deine Frage kannst du df.query('col == val')

Reproduziert von http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query

 In [167]: n = 10 In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc')) In [169]: df Out[169]: abc 0 0.687704 0.582314 0.281645 1 0.250846 0.610021 0.420121 2 0.624328 0.401816 0.932146 3 0.011763 0.022921 0.244186 4 0.590198 0.325680 0.890392 5 0.598892 0.296424 0.007312 6 0.634625 0.803069 0.123872 7 0.924168 0.325076 0.303746 8 0.116822 0.364564 0.454607 9 0.986142 0.751953 0.561512 # pure python In [170]: df[(df.a < df.b) & (df.b < df.c)] Out[170]: abc 3 0.011763 0.022921 0.244186 8 0.116822 0.364564 0.454607 # query In [171]: df.query('(a < b) & (b < c)') Out[171]: abc 3 0.011763 0.022921 0.244186 8 0.116822 0.364564 0.454607 

Sie können auch auf Variablen in der Umgebung zugreifen, indem Sie ein @ voranstellen.

 exclude = ('red', 'orange') df.query('color not in @exclude') 

Hier ist ein einfaches Beispiel

 from pandas import DataFrame # Create data set d = {'Revenue':[100,111,222], 'Cost':[333,444,555]} df = DataFrame(d) # mask = Return True when the value in column "Revenue" is equal to 111 mask = df['Revenue'] == 111 print mask # Result: # 0 False # 1 True # 2 False # Name: Revenue, dtype: bool # Select * FROM df WHERE Revenue = 111 df[mask] # Result: # Cost Revenue # 1 444 111 

Ich habe gerade versucht, dies zu bearbeiten, aber ich war nicht eingeloggt, also bin ich mir nicht sicher, wo meine Bearbeitung ging. Ich habe versucht, mehrere Auswahl zu integrieren. Also ich denke eine bessere Antwort ist:

Für einen einzigen Wert ist der einfachste (menschlich lesbare) wahrscheinlich:

 df.loc[df['column_name'] == some_value] 

Für Listen von Werten können Sie auch:

 df.loc[df['column_name'].isin(some_values)] 

Beispielsweise,

 import pandas as pd import numpy as np df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(), 'B': 'one one two three two two one three'.split(), 'C': np.arange(8), 'D': np.arange(8) * 2}) print(df) # ABCD # 0 foo one 0 0 # 1 bar one 1 2 # 2 foo two 2 4 # 3 bar three 3 6 # 4 foo two 4 8 # 5 bar two 5 10 # 6 foo one 6 12 # 7 foo three 7 14 print(df.loc[df['A'] == 'foo']) 

Erträge

  ABCD 0 foo one 0 0 2 foo two 2 4 4 foo two 4 8 6 foo one 6 12 7 foo three 7 14 

Wenn du mehrere Kriterien hast, die du auswählen möchtest, kannst du sie in eine Liste setzen und 'isin' verwenden:

 print(df.loc[df['B'].isin(['one','three'])]) 

Erträge

  ABCD 0 foo one 0 0 1 bar one 1 2 3 bar three 3 6 6 foo one 6 12 7 foo three 7 14 

Beachten Sie jedoch, dass, wenn Sie dies viele Male tun wollen, ist es effizienter, A den Index zuerst zu machen, und dann verwenden Sie df.loc:

 df = df.set_index(['A']) print(df.loc['foo']) 

Erträge

  ABCD foo one 0 0 foo two 2 4 foo two 4 8 foo one 6 12 foo three 7 14 
 df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(), 'B': 'one one two three two two one three'.split(), 'C': np.arange(8), 'D': np.arange(8) * 2}) df[df['A']=='foo'] OUTPUT: ABCD 0 foo one 0 0 2 foo two 2 4 4 foo two 4 8 6 foo one 6 12 7 foo three 7 14 

Wenn du hierher gekommen bist, um Zeilen aus einem Dataframe auszuwählen, indem du diejenigen einschreibst, deren Spaltenwert NICHT irgendwelche einer Liste von Werten ist, hier ist, wie man um die Antwort von unutbu für eine Liste von Werten oben umkippt:

 df.loc[~df['column_name'].isin(some_values)] 

(Um nicht einen einzigen Wert, natürlich, verwenden Sie einfach die reguläre nicht gleich Operator != .)

Beispiel:

 import pandas as pd df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(), 'B': 'one one two three two two one three'.split()}) print(df) 

gibt uns

  AB 0 foo one 1 bar one 2 foo two 3 bar three 4 foo two 5 bar two 6 foo one 7 foo three 

Um nur den Zeilen zuzuordnen, die NICHT one oder three in Spalte B :

 df.loc[~df['B'].isin(['one', 'three'])] 

Erträge

  AB 2 foo two 4 foo two 5 bar two 

Um diese berühmte Frage df.groupby('column_name').get_group('column_desired_value').reset_index() (wenn auch ein bisschen zu spät): Sie können auch df.groupby('column_name').get_group('column_desired_value').reset_index() , um einen neuen df.groupby('column_name').get_group('column_desired_value').reset_index() mit einer bestimmten Spalte mit einem bestimmten Wert zu machen . Z.B

 import pandas as pd df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(), 'B': 'one one two three two two one three'.split()}) print("Original dataframe:") print(df) b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis = 1) #NOTE: the final drop is to remove the extra index column returned by groupby object print('Sub dataframe where B is two:') print(b_is_two_dataframe) 

Führen Sie das gibt:

 Original dataframe: AB 0 foo one 1 bar one 2 foo two 3 bar three 4 foo two 5 bar two 6 foo one 7 foo three Sub dataframe where B is two: AB 0 foo two 1 foo two 2 bar two 

Mit numpy.wo Ergebnisse können schneller erreicht werden, mit unubtu Setup:

 In [76]: df.iloc[np.where(df.A.values=='foo')] Out[76]: ABCD 0 foo one 0 0 2 foo two 2 4 4 foo two 4 8 6 foo one 6 12 7 foo three 7 14 In [68]: %timeit df.iloc[np.where(df.A.values=='foo')] 1000 loops, best of 3: 380 µs per loop In [69]: %timeit df.loc[df['A'] == 'foo'] 1000 loops, best of 3: 745 µs per loop In [71]: %timeit df.loc[df['A'].isin(['foo'])] 1000 loops, best of 3: 562 µs per loop In [72]: %timeit df[df.A=='foo'] 1000 loops, best of 3: 796 µs per loop In [74]: %timeit df.query('(A=="foo")') 1000 loops, best of 3: 1.71 ms per loop 
  • Pandas und Unicode
  • Csv & xlsx Dateien importieren in pandas data frame: speed issue
  • Neue Spalte mit Spaltenname aus max Spalte nach Index Pandas
  • Wie importiere ich unbeschriftete und fehlende Spalten in ein Pandas-Dataframe?
  • Pandas Dataframe: Index von max Element erhalten
  • So effizient verarbeiten Time-Series-Daten in Pandas
  • Pandas: Flag aufeinanderfolgende Werte
  • Pandas gestapeltes Balkendiagramm dupliziert Farben für große Legenden
  • Pandas Abfrage Zeilen nach Liste
  • Was passiert, wenn man 2 Pandas Series vergleicht
  • Gibt es eine "Gruppierung von" Operation entgegengesetzt zu .groupby in Pandas?
  • Python ist die beste Programmiersprache der Welt.