Ich möchte einen Datenrahmen mit Regex in einer der Spalten sauber filtern.
Für ein erfundenes Beispiel:
In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]:
a b
0 1 hi
1 2 foo
2 3 fat
3 4 cat
Ich möchte die Zeilen nach denen filtern, die mit der f
Verwendung eines regulären Ausdrucks beginnen. Zuerst gehen:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
Das ist nicht allzu nützlich. Dies bringt mir jedoch meinen booleschen Index:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
So konnte ich meine Einschränkung tun, indem ich:
In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]:
a b
1 2 foo
2 3 fat
Das bringt mich jedoch dazu, eine Gruppe künstlich in den regulären Ausdruck zu bringen, und scheint vielleicht nicht der richtige Weg zu sein. Gibt es einen besseren Weg, dies zu tun?
foo[foo.b.str.startswith("f")]
wird es funktionieren.foo[foo.b.str.match('(f.*)').str.len() > 0]
ist eine ziemlich gute Lösung! Anpassbarer und nützlicher als Starts, da es die Vielseitigkeit von Regex bietet.foo[foo.b.str.match('f.*')]
funktioniert in Pandas 0.24.2 für mich.Antworten:
Verwendung enthält stattdessen:
quelle
df.loc[df.b.str.contains('^f'), :]
df[df.b.str.contains('^f'), :]
Es gibt bereits eine String-Handling-Funktion
Series.str.startswith()
. Du solltest es versuchenfoo[foo.b.str.startswith('f')]
.Ergebnis:
Ich denke was du erwartest.
Alternativ können Sie die Option enthält mit Regex verwenden. Beispielsweise:
Ergebnis:
na=False
dient dazu, Fehler zu vermeiden, falls nan-, null- usw. Werte vorliegenquelle
df[~df.CITY.str.contains('~.*', regex= True, na=False)]
Mehrspaltige Suche mit Datenrahmen:
quelle
frame
? und'C:\test\test.txt'
? Scheint, als würden Sie eine andere Frage beantworten.Dies mag etwas spät sein, aber in Pandas ist dies jetzt einfacher. Sie können match with aufrufen
as_indexer=True
, um boolesche Ergebnisse zu erhalten. Dies wird dokumentiert (zusammen mit der Differenz zwischenmatch
undcontains
) hier .quelle
Vielen Dank für die großartige Antwort @ user3136169. Hier ist ein Beispiel dafür, wie dies auch beim Entfernen von NoneType-Werten erfolgen kann.
Sie können auch Regex als Argument hinzufügen:
quelle
Schreiben Sie eine Boolesche Funktion, die den regulären Ausdruck überprüft und auf die Spalte anwenden anwendet
quelle
Mit
str
Scheibequelle