2015-07-13 9 views
5

Ich habe für mehr als 3 Monate Pandas benutze und ich habe eine gute Vorstellung über die Datenrahmen zugreifen und Abfragen usw.LIKE innerhalb pandas.query() verwenden

ich eine Anforderung erhalten haben, wobei ich die abfragen wollte Datenrahmen mit LIKE-Schlüsselwort (ähnlich wie SQL) in pandas.query().

heißt: Am versucht pandas.query ("column_name LIKE 'abc%'") Befehl aber seine andernfalls auszuführen.

Ich kenne einen alternativen Ansatz, der str.contains ("abc%") verwendet, aber dies erfüllt nicht unsere Anforderung.

Wir wollten LIKE innerhalb pandas.query() ausführen. Wie kann ich das tun?

+0

Es ist schon eine Weile her, seit diese Frage gestellt wurde: hat man eine Lösung gefunden oder ist diese nur noch über 'str.contains()' erreichbar? – user1717828

Antwort

2

Nicht Abfrage mit(), aber das wird dir geben, was Sie suchen:

df[df.col_name.str.startswith('abc')] 


df 
Out[93]: 
    col_name 
0  this 
1  that 
2  abcd 

df[df.col_name.str.startswith('abc')] 
Out[94]: 
    col_name 
2  abcd 

Abfrage verwendet die eval() Pandas und beschränkt mich in dem, was man in sie verwenden kann. Wenn Sie reine SQL verwenden möchten Sie pandasql, wo die folgende Erklärung könnte in Erwägung ziehen würde für Sie arbeiten:

sqldf("select col_name from df where col_name like 'abc%';", locals()) 

oder alternativ, wenn Ihr Problem mit den Pandas str Methoden war, dass die Spalte nicht vollständig von String-Typ war man konnte tun Sie folgendes:

df[df.col_name.str.startswith('abc').fillna(False)] 
+0

Ich habe versucht, SQLDF, das ist mein Problem zu lösen, aber ich sehe große Leistungsproblem mit ihm. Ich fügte 95lakhs Datensätze mit regulären df.query() hinzu, ich konnte das Ergebnis in 1min bekommen. Aber wenn ich SQLDF verwende, dauert es mindestens 10 Minuten. –

+0

SQLDF erstellt und zerreißt eine SQLite-Datenbank, daher der Leistungseinbruch. Gibt es einen Grund, warum du startswith() nicht verwenden kannst? – khammel

4

Super spät zu diesem Beitrag, aber für jeden, der darauf stößt. Sie können die boolesche Indizierung verwenden, indem Sie Ihre Suchkriterien basierend auf einer String-Methode überprüfen str.contains.

Beispiel:

dataframe[dataframe.summary.str.contains('Windows Failed Login', case=False)] 

In dem obigen Code, die Schnipsel in den Klammern beziehen sich auf die Zusammenfassung Spalte des Datenrahmen und verwenden das Verfahren zum .str.contains'Windows Failed Login' innerhalb jeden Wertes dieser Serie zu suchen. Groß- und Kleinschreibung kann auf "Wahr" oder "Falsch" gesetzt werden. Dies wird den booleschen Index zurückgeben, der dann verwendet wird, um den gesuchten Datenrahmen zurückzugeben. Sie können .fillna() mit diesem auch in den Klammern verwenden, wenn Sie irgendwelche Nan-Fehler auftreten.

Hoffe, das hilft!

+0

Dies ist eine großartige Antwort !! – sushmit

+0

Ich hatte keine Zusammenfassungsspalte, daher kann man für einen zufälligen Spaltennamen 'new_df = df [df ['Column']. Str.contains ('irgendwas')]' verwenden – arie64

Verwandte Themen