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
Questo è esattamente! Lo stavo pensando completamente; ancora una volta, i panda sono eleganti, dove presumo debba essere complicato. Grazie! – prooffreader
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? –
@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