Pandas: Wählen Sie alle Zeilen aus, die mit mehreren Bedingungen übereinstimmen

Ich habe folgendes dataframe:

>>> df = pd.DataFrame({'col1': [1, 2, 1], 'col2': [6, 3, 6]}) >>> df col1 col2 0 1 6 1 2 3 2 1 6 

Und das folgende Wörterbuch:

  >>> di = {'col1': 1, 'col2': 6} >>> di {'col2': 6, 'col1': 1} 

Ich suche nach einer Lösung, die durch di durchlaufen wird und die passenden Zeilen in df finden . Ich möchte keine Zeile schreiben, die die Spaltennamen und Werte speziell verwendet. Ich habe diese Lösungen auf dem Forum gesehen, und das ist nicht das, was ich hier zu tun versuche. Die (schreckliche Nicht-) Lösung, die ich gegangen war, war:

  is_not_first = True tf_series = None for key, val in di.iteritems(): if is_not_first: tf_series = (tf_series & (df[key] == val)) else: tf_series = (df[key] == val) is_not_first = False 

Ich beabsichtige , tf_series zu verwenden, um eine weitere Spalte in df später zu setzen:

  df.loc[tf_series, 'col3'] = True 

Urteil von vielen der ausgezeichneten Pandas Beiträge habe ich gesehen, ich bin sicher, es gibt etwas viel prägnanter, nicht zu erwähnen, etwas, das tatsächlich funktioniert. Vielen Dank!

One Solution collect form web for “Pandas: Wählen Sie alle Zeilen aus, die mit mehreren Bedingungen übereinstimmen”

Sie können alle Ihre Logik in 1 Zeile kombinieren und anstatt eine redundante Serie zu erstellen, können Sie einen anderen DataFrame erstellen, der denselben Index / Spalte mit Ihrem df hat und direkt zu df['col3'] zuordnen, hier ist ein Weg zu erreichen Dies:

 In [1]: import pandas as pd In [2]: df = pd.DataFrame({'col1': [1, 2, 1], 'col2': [6, 3, 6]}) In [3]: di = {'col1': 1, 'col2': 6} In [4]: df['col3'] = pd.DataFrame([df[k]==v for k,v in di.iteritems()]).all() In [5]: df Out[5]: col1 col2 col3 0 1 6 True 1 2 3 False 2 1 6 True 

Oder eine schnellere und kurzhändige Version mit Karte :

 In [6]: df['col3'] = pd.DataFrame(map(lambda k: df[k]==di[k], di)).all() 

Aufschlüsselung Erklärung

Wenn du die Liste ansiehst, wenn du das Wörterbuch di iterierst, gibt es dir Schlüssel / Wert- Paare, die in der Tat die Spalten / Werte deines ursprünglichen df sind . Also df[column] gibt dir seinen Wert, und du vergleicht das mit Wörterbuch v , es liefert True / False .

 In [8]: [df[k]==v for k,v in di.iteritems()] Out[8]: [0 True 1 False 2 True Name: col2, dtype: bool, 0 True 1 False 2 True Name: col1, dtype: bool] 

Dann baust man einen Schatten DataFrame aus diesen Ergebnissen, wird dir das geben:

 pd.DataFrame([df[k]==v for k,v in di.iteritems()]) Out[9]: 0 1 2 col2 True False True col1 True False True 

Bearbeiten

Wie @ant zeigte, habe ich falsch verwendet (), während es alles () sein sollte , um alle True Werte zu erfüllen:

Schließlich alle (), die Index / Ergebnis zurückgeben, die oben Spalte (s) erfüllen ALLE True Bedingung:

 In [10]: pd.DataFrame([df[k]==v for k,v in di.iteritems()]).all() Out[10]: 0 True 1 False 2 True dtype: bool 

Und du musst nur diese Ergebnisspalte zu df['col3'] , und du bist fertig.

Um SettingWithCopy Warnung zu vermeiden, SettingWithCopy du nur den einen Liner in 2:

 new_col = pd.DataFrame(df[k]==v for k,v in di.iteritems()).all() df['col3'] = new_col 
  • Multiplizieren Sie zwei Datenrahmen mit ähnlichem Index in Python-Pandas
  • Tabelle, mit der unterschiedlichen Länge der Säulen
  • Python Pandas DataFrame entfernen leere Zellen
  • Wie komme ich um die Zeitspalte zu der nächsten Viertelstunde
  • Wie man zwei Datenrahmen in Python-Pandas kombiniert
  • Probenahme mit dem aktuellsten Wert
  • Ersetzen von NaT mit Epoche in Pandas
  • Python-Pandas, bestimmte Spalten zu Zeilen
  • Geschichtete Proben von Pandas
  • Alle Spalten eines Dataframs sortieren
  • Pandas Python-Dose kann mit vektorisierten Eingängen verwendet werden
  • Python ist die beste Programmiersprache der Welt.