Wie kann ich die Entsprechungen von SQL IN
und erreichen NOT IN
?
Ich habe eine Liste mit den erforderlichen Werten. Hier ist das Szenario:
df = pd.DataFrame({'countries':['US','UK','Germany','China']})
countries = ['UK','China']
# pseudo-code:
df[df['countries'] not in countries]
Meine derzeitige Vorgehensweise ist wie folgt:
df = pd.DataFrame({'countries':['US','UK','Germany','China']})
countries = pd.DataFrame({'countries':['UK','China'], 'matched':True})
# IN
df.merge(countries,how='inner',on='countries')
# NOT IN
not_in = df.merge(countries,how='left',on='countries')
not_in = not_in[pd.isnull(not_in['matched'])]
Aber das scheint ein schrecklicher Kludge zu sein. Kann jemand es verbessern?
python
pandas
dataframe
sql-function
LondonRob
quelle
quelle
Antworten:
Sie können verwenden
pd.Series.isin
.Für "IN" verwenden Sie:
something.isin(somewhere)
Oder für "NOT IN":
~something.isin(somewhere)
Als Beispiel:
quelle
isin
wurde in .13 hinzugefügt.df = pd.Series({'countries':['US','UK','Germany','China']})
df
, sowohl mein als auch sein, ist einDataFrame
.countries
ist eine Liste.df[~df.countries.isin(countries)]
erzeugt aDataFrame
, nicht aSeries
und scheint sogar in 0.11.0.dev-14a04dd zu funktionieren.countries
Variable immer wieder verwenden. Nun, das OP macht es, und das ist vererbt, aber dass etwas vorher schlecht gemacht wurde, rechtfertigt es nicht, es jetzt schlecht zu machen.Alternative Lösung mit der Methode .query () :
quelle
query
ist nicht mehr experimentell.Pandas bietet zwei Methoden an:
Series.isin
undDataFrame.isin
für Serien- bzw. DataFrames.Filtern von DataFrame basierend auf EINER Spalte (gilt auch für Serien)
Das häufigste Szenario ist das Anwenden einer
isin
Bedingung auf eine bestimmte Spalte, um Zeilen in einem DataFrame zu filtern.Series.isin
akzeptiert verschiedene Typen als Eingaben. Im Folgenden finden Sie alle gültigen Methoden, um das zu erhalten, was Sie möchten:Filtern Sie nach vielen Spalten
Manchmal möchten Sie eine In-Mitgliedschaftsprüfung mit einigen Suchbegriffen auf mehrere Spalten anwenden.
isin
Verwenden Sie Folgendes, um die Bedingung auf beide Spalten "A" und "B" anzuwendenDataFrame.isin
:Um Zeilen beizubehalten
True
, in denen sich mindestens eine Spalte befindet , können wirany
entlang der ersten Achse Folgendes verwenden:Beachten Sie, dass Sie, wenn Sie jede Spalte durchsuchen möchten, den Schritt zur Spaltenauswahl einfach weglassen und ausführen müssen
In ähnlicher Weise zu Reihen zu behalten , wo alle Spalten sind
True
, die Verwendungall
in der gleichen Weise wie zuvor.Bemerkenswerte Mentions:
numpy.isin
,query
, Listenkomprehensionen (string data)Zusätzlich zu den oben beschriebenen Methoden können Sie auch das numpy-Äquivalent verwenden :
numpy.isin
.Warum ist es eine Überlegung wert? NumPy-Funktionen sind aufgrund des geringeren Overheads normalerweise etwas schneller als ihre Pandas-Entsprechungen. Da dies eine elementweise Operation ist, die nicht von der Indexausrichtung abhängt, gibt es nur sehr wenige Situationen, in denen diese Methode kein geeigneter Ersatz für Pandas ist
isin
.Pandas-Routinen sind normalerweise iterativ, wenn mit Zeichenfolgen gearbeitet wird, da Zeichenfolgenoperationen schwer zu vektorisieren sind. Es gibt viele Hinweise darauf, dass das Listenverständnis hier schneller sein wird. . Wir greifen
in
jetzt auf einen Scheck zurück.Die Angabe ist jedoch viel unhandlicher. Verwenden Sie sie daher nur, wenn Sie wissen, was Sie tun.
Schließlich gibt es
DataFrame.query
noch etwas, das in dieser Antwort behandelt wurde . numexpr FTW!quelle
Ich habe normalerweise generisches Filtern über Zeilen wie diese durchgeführt:
quelle
Ich wollte dfbc-Zeilen herausfiltern, die eine BUSINESS_ID hatten, die sich auch in der BUSINESS_ID von dfProfilesBusIds befand
quelle
Zusammenstellung möglicher Lösungen aus den Antworten:
Für in:
df[df['A'].isin([3, 6])]
Für NOT IN:
df[-df["A"].isin([3, 6])]
df[~df["A"].isin([3, 6])]
df[df["A"].isin([3, 6]) == False]
df[np.logical_not(df["A"].isin([3, 6]))]
quelle
logical_not
ist ein Bissenäquivalent des~
Bedieners.implementieren in :
nicht in wie in anderen Ländern umsetzen :
quelle