2016-07-04 15 views
6

Ho un dataframe panda le cui voci sono tutte le stringhe:Selezionare righe contenenti i valori da panda dataframe

A  B  C 
1 apple banana pear 
2 pear pear apple 
3 banana pear pear 
4 apple apple pear 

ecc voglio selezionare tutte le righe che contengono una certa stringa, per esempio, 'banane'. Non so quale colonna verrà visualizzata ogni volta. Naturalmente, posso scrivere un ciclo for e scorrere tutte le righe. Ma c'è un modo più facile o più veloce per farlo?

+3

È anche possibile fare '[df.values ​​== 'banane'] df' –

risposta

2

Con NumPy, potrebbe essere Vettorializzare per cercare il maggior numero di stringhe come si desidera, in questo modo -

def select_rows(df,search_strings): 
    unq,IDs = np.unique(df,return_inverse=True) 
    unqIDs = np.searchsorted(unq,search_strings) 
    return df[((IDs.reshape(df.shape) == unqIDs[:,None,None]).any(-1)).all(0)] 

Campione run -

In [393]: df 
Out[393]: 
     A  B  C 
0 apple banana pear 
1 pear pear apple 
2 banana pear pear 
3 apple apple pear 

In [394]: select_rows(df,['apple','banana']) 
Out[394]: 
     A  B  C 
0 apple banana pear 

In [395]: select_rows(df,['apple','pear']) 
Out[395]: 
     A  B  C 
0 apple banana pear 
1 pear pear apple 
3 apple apple pear 

In [396]: select_rows(df,['apple','banana','pear']) 
Out[396]: 
     A  B  C 
0 apple banana pear 
+0

In realtà questo è più facile da usare durante la ricerca di più stringhe – mcglashan

3

È possibile creare una maschera booleano dal confronto tra l'intero df contro la stringa e chiamare dropna passando param how='all' far cadere le righe in cui la stringa non appare in tutti i colli:

per verificare i valori multipli è possibile utilizzare più maschere:

In [90]: 
banana = df[(df=='banana')].dropna(how='all') 
banana 

Out[90]: 
     A  B C 
1  NaN banana NaN 
3 banana  NaN NaN 

In [91]:  
apple = df[(df=='apple')].dropna(how='all') 
apple 

Out[91]: 
     A  B  C 
1 apple NaN NaN 
2 NaN NaN apple 
4 apple apple NaN 

È possibile utilizzare index.intersection per indicizzare solo i valori degli indici comuni:

In [93]: 
df.loc[apple.index.intersection(banana.index)] 

Out[93]: 
     A  B  C 
1 apple banana pear 
+0

Grazie. Questo sicuramente funziona se sto cercando una stringa. Cosa succede se voglio selezionare le righe che contengono sia 'banana' che 'mela'? – mcglashan

+0

Non conosco i Panda, ma forse qualcosa del genere: 'df [df == 'banana', 'apple']. Dropna (how = 'all')'? – Deadpool

+0

@ Andromedae93 Questo mi dà un errore TypeE – mcglashan

3

Per valore di ricerca unico

df[df.values == "banana"] 

o

df[df.isin(['banana'])] 

Per più termini di ricerca:

df[(df.values == "banana")|(df.values == "apple") ] 

o

df[df.isin(['banana', "apple"])] 

    #   A  B  C 
    # 1 apple banana NaN 
    # 2  NaN  NaN apple 
    # 3 banana  NaN NaN 
    # 4 apple apple NaN 

Da Divakar: linee con entrambi vengono restituiti.

select_rows(df,['apple','banana']) 

#   A  B  C 
# 0 apple banana pear 
+0

L'ultima riga mi dà effettivamente un dataframe vuoto quando lo provo – mcglashan

Problemi correlati