2015-01-15 22 views
39

Supponiamo di avere un frame di dati in Python Panda che assomiglia a questo:Come filtrare le righe contenenti un modello stringa da un dataframe Pandas

df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']}) 

Oppure, sotto forma di tabella:

ids vals 
aball 1 
bball 2 
cnut 3 
fball 4 

Come faccio a filtrare le righe che contengono la parola chiave "palla?" Ad esempio, l'uscita dovrebbe essere:

ids vals 
aball 1 
bball 2 
fball 4 
+2

Dovresti accettare una delle 5 risposte che sono state pubblicate, ci sarà un segno di spunta sotto i pulsanti di voto, nota che le risposte 'str.contains' sono probabilmente il metodo più veloce e raccomandato per i tuoi requisiti: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.strings.StringMethods.contains.html#pandas.core.strings.StringMethods.taintains – EdChum

risposta

83
In [3]: df[df['ids'].str.contains("ball")] 
Out[3]: 
    ids vals 
0 aball  1 
1 bball  2 
3 fball  4 
+0

Ciao Amit, Grazie mille, funziona perfettamente! –

+0

@JohnKnight - Prego! – Amit

+1

Come si inverte questo per trovare tutte le righe che non contengono la stringa? – user4896331

7
>>> 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 
31
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1 

passo-passo spiegazione (dall'interno all'esterno):

  • df['ids'] seleziona la colonna ids della data frame (dal punto di vista tecnico, l'oggetto df[ids] è di tipo pandas.Series)
  • df['ids'].str ci permette di applicare metodi stringa vettorializzate (ad esempio, lower, contains) per le serie
  • df['ids'].str.contains('ball') controlli ciascuna elemento della serie se il valore elemento ha la stringa 'pallone' come una stringa. Il risultato è una serie di booleani che indicano True o False sull'esistenza di una sottostringa 'palla'.
  • df[df['ids'].str.contains('ball')] applica la "maschera" booleana al dataframe e restituisce una vista contenente record appropriati.
  • na = False rimuove i valori NA/NaN dalla considerazione; altrimenti può essere restituito un errore ValueError.
+0

Puoi spiegare cosa sta facendo quel codice e come funziona, per favore? – Kevin

+0

Come lavorare con la corrispondenza parziale e afferrare la stringa rimanente con la corrispondenza parziale ''#': str' qualcosa del genere? –

+2

Assolutamente da amare quando qualcuno fa una spiegazione passo dopo passo. Aiuta davvero con la comprensione! – user4896331

1

Se si desidera impostare la colonna su cui si filtra come nuovo indice, è possibile considerare l'utilizzo di .filter; se vuoi tenerlo come una colonna separata, allora la str.contains è la strada da percorrere.

Diciamo che avete

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 

e il vostro piano è quello di filtrare tutte le righe in cui ids contiene ball e impostare ids come nuovo indice, si può fare

df.set_index('ids').filter(like='ball', axis=0) 

che dà

  vals 
ids   
aball  1 
bball  2 
fball  4 
ballxyz  5 

Ma filter consente anche di passare un'espressione regolare, in modo da poter filtrare solo le righe in cui la voce della colonna termina con ball. In questo caso si utilizza

df.set_index('ids').filter(regex='ball$', axis=0) 

     vals 
ids   
aball  1 
bball  2 
fball  4 

Nota che ora la voce con ballxyz non è incluso come si comincia con ball e non finisce con esso.

Se si desidera ottenere tutte le voci che iniziano con ball è possibile utilizzare semplici

df.set_index('ids').filter(regex='^ball', axis=0) 

cedendo

  vals 
ids   
ballxyz  5 

Le stesse opere con colonne; tutto ciò che è necessario modificare è la parte axis=0. Se filtri in base alle colonne, sarebbe axis=1.

Problemi correlati