2014-08-31 8 views
5

ho un df, e voglio eseguire qualcosa di simile:Selezione righe di una dataframe sulla base di due condizioni di Pandas pitone

subsetdf= df.loc[(df['Item_Desc'].str.contains('X')==True) or \ 
       (df['Item_Desc'].str.contains('Y')==True),:] 

che seleziona tutte le righe che hanno la colonna Desc Item una stringa di "X "o" Y ".

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Ottengo l'errore quando lo eseguo. Qualsiasi aiuto?

risposta

5

Utilizzare | anziché or. Quindi:

df.loc[(cond1) | (cond2), :] 

L'operatore or vuole confrontare due valori booleani (o due espressioni che restituiscono true o false). Ma una serie (o una matrice numpy) non valuta semplicemente True o False, e in questo caso vogliamo confrontare entrambe le serie in base agli elementi. Per questo è possibile utilizzare | che viene chiamato 'bitwise o'.

Panda segue qui le convenzioni numpy. Vedi here nei documenti panda per una spiegazione su di esso.

+0

Ti dispiacerebbe indicarmi i documenti per questo? Questa è una cosa dei panda o di un pitone? Non ho trovato nulla su "|" – robertevansanders

+0

@joris, bella risposta. C'è un modo più generale? per esempio. se hai un elenco di nomi di colonne, ad es. '['d1', 'd2', 'd3' ...]' c'è un modo per specificare una condizione comune da applicare a tutti e includere la riga se qualcuno di essi corrisponde. Nel mio caso i cols d1 ecc hanno 1 o 0 e vogliono solo le righe con 1 in una delle colonne d1 ecc. Ci sono altri cols, con altri dati, ad es. testo, che non sto considerando per questa selezione –

+0

Non una soluzione generale, ma in tal caso si potrebbe fare qualcosa come '(df [cols] == 1) .any (axis = 1)' da usare come condizione. – joris

1

La condizione dovrebbe essere la seguente

df.loc[(cond1) | (cond2)] 

Ciascuna condizione deve essere racchiuso tra parentesi pure. Per le parentesi viene data l'alta priorità rispetto all'operatore OR "bit" bit a bit. Quando le parentesi non sono fornite, darebbe anche lo stesso errore

Problemi correlati