2013-10-03 40 views
17

Mi chiedo se esiste un modo più efficiente di utilizzare la funzione str.contains() in Panda per cercare due stringhe parziali allo stesso tempo. Voglio cercare una data colonna in un dataframe per i dati che contengono "nt" o "nv". In questo momento, il mio codice è simile al seguente:Utilizzo di str.contains() nei panda con i dataframes

df[df['Behavior'].str.contains("nt", na=False)] 
    df[df['Behavior'].str.contains("nv", na=False)] 

E quindi appendo un risultato a un altro. Quello che mi piacerebbe fare è usare una singola riga di codice per cercare qualsiasi dato che includa "nt" OR "nv" OR "nf". Ho giocato con alcuni modi che pensavo dovessero funzionare, tra cui solo attaccare una pipe tra i termini, ma tutti questi si traducono in errori. Ho controllato la documentazione, ma non la vedo come un'opzione. Ottengo errori come questo:

--------------------------------------------------------------------------- 
    TypeError         Traceback (most recent call last) 
    <ipython-input-113-1d11e906812c> in <module>() 
    3 
    4 
    ----> 5 soctol = f_recs[f_recs['Behavior'].str.contains("nt"|"nv", na=False)] 
    6 soctol 

    TypeError: unsupported operand type(s) for |: 'str' and 'str' 

C'è un modo veloce per fare questo? Grazie per l'aiuto, sono un principiante, ma adoro i panda per i conflitti di dati.

risposta

32

L'è un'espressione regolare e dovrebbe essere in una stringa:

"nt|nv" # rather than "nt" | " nv" 
f_recs[f_recs['Behavior'].str.contains("nt|nv", na=False)] 

Python non consente di utilizzare il o (|) Operatore su stringhe:

In [1]: "nt" | "nv" 
TypeError: unsupported operand type(s) for |: 'str' and 'str' 
+2

grazie una tale bellezza! . attenzione però, non ci deve essere spazio tra la pipe e i termini di ricerca! – jaknap32

+3

@ jaknap32: Se usi il modificatore '(? X)', puoi aggiungere spazi dove vuoi - '" (? X) nt | nv "' - (ma se hai degli spazi significativi nel pattern, dovrai sfuggirle, così come '#' char). Vedi [Python 're.X' docs] (https://docs.python.org/2/library/re.html#re.VERBOSE). Comunque, 'n [tv]' è una regex migliore di 'nt | nv'. –

+0

+1 per l'espressione "na = False". I miei dati hanno delle lacune e la mia stringa contiene la funzione non funzionerà senza di essa. –

Problemi correlati