it-swarm.com.de

So filtern Sie Zeilen, die ein Zeichenfolgenmuster enthalten, aus einem Pandas dataframe

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
97
John Knight
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
     ids  vals
0  aball     1
1  bball     2
3  fball     4
209
Amit
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)
  • Mit df['ids'].str Können wir vektorisierte Zeichenfolgenmethoden (z. B. lower, contains) auf die Serie anwenden
  • df['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.
67
Jubbles
>>> 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
9
user3820991

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 idsball 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.

5
Cleb