2014-05-01 11 views
7

So come creare una nuova colonna con apply o np.where in base ai valori di un'altra colonna, ma un modo di cambiare selettivamente i valori di una colonna esistente mi sfugge; Sospetto che sia coinvolto lo df.ix? Sono vicino?I panda modificano i valori delle colonne in base all'array booleano

Ad esempio, ecco un semplice dataframe (il mio ha decine di migliaia di righe). Vorrei cambiare il valore nella colonna 'flag' (diciamo a 'Blue') se il nome termina con la lettera 'e':

>>> import pandas as pd 
>>> df = pd.DataFrame({'name':['Mick', 'John', 'Christine', 'Stevie', 'Lindsey'], \ 
     'flag':['Purple', 'Red', nan, nan, nan]})[['name', 'flag']] 
>>> print df 

     name flag 
0  Mick Purple 
1  John  Red 
2 Christine  NaN 
3  Stevie  NaN 
4 Lindsey  NaN 
[5 rows x 2 columns] 

posso fare una serie booleano dai miei criteri:

>boolean_result = df.name.str.contains('e$') 
>print boolean_result 
0 False 
1 False 
2  True 
3  True 
4 False 
Name: name, dtype: bool 

ho solo bisogno il passo cruciale per ottenere il seguente risultato:

>>> print result_wanted 
     name flag 
0  Mick Purple 
1  John  Red 
2 Christine Blue 
3  Stevie Blue 
4 Lindsey  NaN 

risposta

11
df['flag'][df.name.str.contains('e$')] = 'Blue' 
+0

Questo è esattamente! Lo stavo pensando completamente; ancora una volta, i panda sono eleganti, dove presumo debba essere complicato. Grazie! – prooffreader

+2

Pensavo che questo tipo di incarico concatenato non fosse raccomandato? Uso quasi sempre .loc quando ho trovato alcuni effetti molto strani di questo tipo di incarichi. Voglio dire che funziona chiaramente qui, ma in generale ho avuto l'impressione che questo sia da evitare. È questa la tua comprensione? –

+2

@WoodyPride Per l'indicizzazione con i vettori booleani questo è perfettamente corretto, se si desidera aggiungere altre forme di indicizzazione, si desidera 'loc'. Ad esempio: 'df.loc [df.name.str.contains ('e $'), 'flag'] = 'Blue''. Hai ragione a essere preoccupato per le visualizzazioni e le copie. L'inversione dell'ordine di accesso (per me) dà un errore: 'df [nome.cf.str.contains ('e $')] ['flag'] = 'Blue'' – U2EF1

Problemi correlati