Angenommen, wir haben einen Datenrahmen in Python Pandas), der so aussieht:
df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']})
Oder in Tabellenform:
ids vals
aball 1
bball 2
cnut 3
fball 4
Wie filtere ich Zeilen, die das Schlüsselwort "ball" enthalten? Die Ausgabe sollte beispielsweise sein:
ids vals
aball 1
bball 2
fball 4
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
ids vals
0 aball 1
1 bball 2
3 fball 4
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1
Schrittweise Erklärung (von innen nach außen):
df['ids']
Wählt die Spalte ids
des Datenrahmens aus (technisch gesehen ist das Objekt df['ids']
Vom Typ pandas.Series
)df['ids'].str
Können wir vektorisierte Zeichenfolgenmethoden (z. B. lower
, contains
) auf die Serie anwendendf['ids'].str.contains('ball')
prüft jedes Element der Serie, ob der Elementwert die Zeichenfolge 'ball' als Teilzeichenfolge enthält. Das Ergebnis ist eine Reihe von Booleschen Werten, die True
oder False
über das Vorhandensein eines 'ball'-Teilstrings anzeigen.df[df['ids'].str.contains('ball')]
wendet die boolesche 'Maske' auf den Datenrahmen an und gibt eine Ansicht mit den entsprechenden Datensätzen zurück.na = False
Entfernt NA/NaN-Werte aus der Betrachtung; Andernfalls wird möglicherweise ein ValueError zurückgegeben.>>> mask = df['ids'].str.contains('ball')
>>> mask
0 True
1 True
2 False
3 True
Name: ids, dtype: bool
>>> df[mask]
ids vals
0 aball 1
1 bball 2
3 fball 4
Wenn Sie die Spalte, nach der Sie filtern, als neuen Index festlegen möchten, können Sie auch .filter
; Wenn Sie es als separate Spalte behalten möchten, dann str.contains
ist der Weg zu gehen.
Angenommen, Sie haben
df = pd.DataFrame({'vals': [1, 2, 3, 4, 5], 'ids': [u'aball', u'bball', u'cnut', u'fball', 'ballxyz']})
ids vals
0 aball 1
1 bball 2
2 cnut 3
3 fball 4
4 ballxyz 5
und Sie möchten alle Zeilen filtern, in denen ids
ball
enthält UND ids
als neuen Index festlegen, was Sie tun können
df.set_index('ids').filter(like='ball', axis=0)
was gibt
vals
ids
aball 1
bball 2
fball 4
ballxyz 5
Mit filter
können Sie jedoch auch einen regulären Ausdruck übergeben, sodass Sie auch nur die Zeilen filtern können, bei denen der Spalteneintrag mit ball
endet. In diesem Fall verwenden Sie
df.set_index('ids').filter(regex='ball$', axis=0)
vals
ids
aball 1
bball 2
fball 4
Beachten Sie, dass der Eintrag mit ballxyz
jetzt nicht enthalten ist, da er mit ball
beginnt und damit nicht endet.
Wenn Sie alle Einträge erhalten möchten, die mit ball
beginnen, können Sie einfach verwenden
df.set_index('ids').filter(regex='^ball', axis=0)
nachgebend
vals
ids
ballxyz 5
Dasselbe gilt für Spalten. Alles, was Sie dann ändern müssen, ist die axis=0
Teil. Wenn Sie nach Spalten filtern, ist dies axis=1
.