Gibt es eine Funktion, die einer Kombination von entspricht? df.isin()
und entspricht df[col].str.contains()
?
Angenommen, ich habe die Serie
s = pd.Series(['cat','hat','dog','fog','pet'])
und möchte alle Orte finden, an denen sich eine s
befindet ['og', 'at']
. Ich möchte alles außer "Haustier" erhalten.
Ich habe eine Lösung, aber sie ist ziemlich unelegant:
searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
Gibt es einen besseren Weg, dies zu tun?
pd.Series.str.contains
. Wenn die Leistung ein Problem darstellt, kann dies eine Untersuchung wert sein.Antworten:
Eine Möglichkeit besteht darin, nur das Regex-
|
Zeichen zu verwenden, um zu versuchen, die einzelnen Teilzeichenfolgen in den Wörtern Ihrer Serie abzugleichens
(wird immer noch verwendetstr.contains
).Sie können den regulären Ausdruck konstruieren, indem Sie die Wörter
searchfor
mit verbinden|
:Wie @AndyHayden in den Kommentaren unten vermerkt hat, achten Sie darauf, ob Ihre Teilzeichenfolgen Sonderzeichen wie
$
und enthalten, mit^
denen Sie buchstäblich übereinstimmen möchten. Diese Zeichen haben im Zusammenhang mit regulären Ausdrücken eine bestimmte Bedeutung und wirken sich auf die Übereinstimmung aus.Sie können Ihre Liste der Teilzeichenfolgen sicherer machen, indem Sie nicht alphanumerische Zeichen mit
re.escape
folgenden Überschriften maskieren :Die Zeichenfolgen in dieser neuen Liste stimmen bei Verwendung mit jedem Zeichen buchstäblich überein
str.contains
.quelle
Sie können
str.contains
allein mit einem Regex-Muster verwenden, indem SieOR (|)
:Oder Sie können die Serie zu einer
dataframe
dann verwendeten hinzufügenstr.contains
:Ausgabe:
quelle
df.col.str.contains(r'(?=.*apple)(?=.*banana)',regex=True)
Hier ist ein einzeiliges Lambda, das auch funktioniert:
Eingang:
Lambda auftragen:
Ausgabe:
quelle