Wählen Sie durch partielle string aus ein pandas DataFrame
Ich habe eine DataFrame
mit 4 Säulen, von denen 2 enthält string-Werte. Ich Frage mich, ob es einen Weg, um Zeilen auszuwählen, die basierend auf eine teilweise übereinstimmung mit einem gegen eine bestimmte Spalte?
In anderen Worten, eine Funktion oder ein lambda-Funktion, die sowas machen würde wie
re.search(pattern, cell_in_question)
Rückgabe ein boolean. Ich bin vertraut mit der syntax von df[df['A'] == "hello world"]
aber kann nicht scheinen, einen Weg finden, das gleiche zu tun mit der Zeichenfolge übereinstimmen, sagen 'hello'
.
Wäre jemand in der Lage zu zeigen mich in die richtige Richtung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf github issue #620, wie es aussieht, werden Sie bald in der Lage sein, Folgendes zu tun:
Update: vektorisiert von string-Methoden (d.h., Serie.str) sind in pandas 0.8.1 und bis.
df[df['A'].str.contains("Hello|Britain")]
.str.contains
zu verwenden.query()
api?df[df['value'].astype(str).str.contains('1234.+')]
für das filtern von nicht-string " -Spalten."hello"
, aber["hello", "hey", "hi"]
?df[df.A.str.contains("STR1.*STR2")]
. wenn die Reihenfolge unwichtig/unbekannt,df[df.A.str.contains("STR1") & df.A.str.contains("STR2")]
Ich bin mit pandas 0.14.1 auf macos in ipython notebook. Ich habe versucht, die vorgeschlagene Zeile oben:
und bekam eine Fehlermeldung:
aber es funktionierte perfekt, wenn ein "==True" - Bedingung wurde Hinzugefügt, wie hier:
Wenn jemand fragt, wie führen Sie ein Verwandtes problem: "Wählen Sie die Spalte durch die Zeichenfolge"
Verwenden:
Und wählen Sie die Zeilen durch partielle string matching, pass
axis=0
zu filtern:df.loc[:, df.columns.str.contains('a')]
df.filter(like='a')
Dieser Beitrag ist gedacht für Leser, die wollen
isin
)...und würde gerne mehr darüber wissen, welche Methoden sollten bevorzugt werden gegenüber anderen.
(P. S.: ich habe gesehen, eine Menge von Fragen zu ähnlichen Themen, ich dachte, es wäre gut, lassen Sie dieses hier.)
Basic Für Die Suche Nach Teilzeichenfolgen
str.enthält
kann verwendet werden, um entweder substring-Suche oder regex-basierte Suche. Die Suche standardmäßig auf regex-Basis, es sei denn, Sie explizit deaktivieren.Hier ist ein Beispiel von regex-basierte Suche,
Manchmal regex-Suche ist nicht erforderlich, so geben Sie
regex=False
zu deaktivieren.Leistung klug, regex-Suche ist langsamer als die substring-Suche:
Vermeiden Sie die Verwendung von regex-Suche, wenn Sie es nicht brauchen.
Adressierung
ValueError
sManchmal, ist die Durchführung einer substring-Suche und-Filterung auf das Ergebnis Ergebnis in
Dies ist in der Regel wegen des gemischten Daten oder NaNs in Ihre Spalte Objekt
Alles, was nicht ist ein string kann nicht von string-Methoden angewendet werden, so ist das Ergebnis NaN (natürlich). Geben Sie In diesem Fall
na=False
zu ignorieren, nicht-string-Daten,Mehrere Substring-Suche
Dies wird am einfachsten erreicht durch eine regex-Suche mit der regex ODER Rohr.
Können Sie auch erstellen Sie eine Liste von Begriffen, dann kommen Sie:
Manchmal ist es klug, um zu entkommen Ihren Bedingungen, wenn Sie Zeichen, die interpretiert werden kann als regex-Metazeichen. Wenn Sie Ihre Begriffe enthalten keine der folgenden Zeichen...
Dann benötigen Sie
re.Flucht
zu Flucht Sie:re.escape
hat den Effekt, dass die Flucht der Sonderzeichen, so dass Sie behandelt sind buchstäblich.Passende Wort(s)
Standardmäßig die substring-Suche sucht nach der angegebenen Zeichenfolge/Muster unabhängig davon, ob es Wort ist oder nicht. Nur match full-Worte, die wir brauchen, um machen Verwendung von regulären Ausdrücken hier—insbesondere unsere Muster angeben müssen Wortgrenzen (
\b
).Beispielsweise
Betrachten wir nun,
v/s
Mehrere Ganzes Wort Suchen
Ähnlich wie oben, außer wir fügen Sie ein Wort-Grenze (
\b
) in den verbundenen Muster.Wo
p
sieht so aus,Eine Tolle Alternative: Verwenden Sie Liste Verstehens!
Weil Sie können! Und sollten Sie! Sie sind in der Regel ein wenig schneller als das string-Methoden, da die string-Methoden sind schwer zu vectorise und haben in der Regel loopy-Implementierungen.
Statt,
Verwenden Sie die
in
operator in einer Liste, comp,Statt,
Verwenden
re.compile
(cache deine regex) +- Muster.Suche
in einer Liste, comp,Wenn "col" hat NaN dann statt
Verwenden,
Mehr Optionen für die Partielle String Matching:
np.char.finden
,np.Vektorisieren
,DataFrame.query
.Neben
str.contains
Liste und Verstehens, Sie können auch die folgenden alternativen.np.char.find
Unterstützt substring-Suche (gelesen: keine regex) nur.
np.vectorize
Dies ist ein wrapper für eine Schleife, aber mit weniger Aufwand als die meisten pandas
str
Methoden.Regex-Lösungen möglich:
DataFrame.query
Unterstützt von string-Methoden, die durch die python-engine. Dies bietet keine sichtbaren performance-Vorteile, aber ist dennoch nützlich zu wissen, wenn Sie benötigen, um dynamisch erstellen Sie Ihre Abfragen.
Mehr Informationen auf
query
undeval
Familie von Methoden gefunden werden können zu Dynamische Auswertung eines Ausdrucks in pandas mit pd.eval().Empfohlene Verwendung Vorrang
str.contains
, für seine Einfachheit in der Handhabung NaNs und gemischte Datennp.vectorize
df.query
any(needle in haystack for needling in ['foo', 'bar'] and haystack in (df['col'], df['col2']))
und Variationen habe ich versucht alle den choke (es beschwert sich überany()
und das ist auch richtig so... Aber der doc ist selig unklar, wie so ein query.r
wenn regex = True standardmäßig? zB hier:df1[df1['col'].str.contains(r'foo(?!$)')]
Kurze Notiz: wenn Sie möchten, zu tun-Auswahl, basierend auf der Zeichenfolge im index enthaltenen, versuchen Sie Folgendes:
Sagen, Sie haben die folgenden
DataFrame
:Können Sie immer die
in
- operator in einen lambda-Ausdruck zu erstellen Sie Ihre filter.Der trick dabei ist die Verwendung der
axis=1
option in derapply
übergeben Elemente der lambda-Funktion Zeile für Zeile, im Gegensatz zu Spalte um Spalte.Hier ist, was ich am Ende dabei für die partielle string übereinstimmt. Wenn jemand ein effizienter Weg, dies zu tun, lassen Sie es mich bitte wissen.
Gibt es Antworten, bevor diese das erreichen der gestellten Funktion, trotzdem möchte ich Ihnen zeigen, die meisten in der Regel so:
Diese Weise können Sie Holen Sie sich die Spalte, die Sie für alles, was der Weg ist schrieb.
( Obviusly, Sie haben zu schreiben, die richtige regex-Ausdruck für jeden Fall )