2013-04-22 15 views
9

Ho un dataframe che copre diversi anni e ad un certo punto hanno cambiato i codici per l'etnia. Quindi ho bisogno di ricodificare i valori condizionali sull'anno - che è un'altra colonna nello stesso dataframe. Per esempio da 1 a 3, 2 a 3, da 3 a 4 e così via:Sostituzione condizionale nei panda

old = [1, 2, 3, 4, 5, 91] 
new = [3, 3, 4, 2, 1, 6] 

E questo è fatto solo per gli anni 1996 al 2001. I valori degli altri anni nella stessa colonna (etnia) deve non essere cambiato. Sperando di evitare troppi loop inefficienti, ho provato:

recode_years = range(1996,2002) 
    for year in recode_years: 
     df['ethnicity'][df.year==year].replace(old, new, inplace=True) 

Ma i valori originali nella dataframe non ho cambiato. Il metodo replace ha sostituito e restituito correttamente i nuovi valori, ma l'opzione inplace sembra non influenzare il dataframe originale quando si applica un condizionale. Questo può essere ovvio per gli utenti esperti di Pandas, ma sicuramente ci deve essere un modo semplice per farlo, invece di eseguire il loop su ogni singolo elemento?

Edit (x2): Il suo è un esempio di un altro approccio che, inoltre, non ha funzionato ('Lunghezza di sostituzioni deve essere uguale lunghezza della serie' e "TypeError: array può non essere tranquillamente gettato al tipo di richiesta"):

oldNewMap = {1:2, 2:3} 
df2 = DataFrame({"year":[2000,2000,2000,2001,2001,2001],"ethnicity":[1,2,1,2,3,1]}) 
df2['ethnicity'][df2.year==2000] = df2['ethnicity'][df2.year==2000].map(oldNewMap) 

Modifica: sembra essere un problema specifico per l'installazione/versione poiché questo funziona correttamente sul mio altro computer.

risposta

10

Essa può essere solo più semplice da fare in un altro modo:

oldNewMap = {1: 3, 2: 3, 3: 4, 4: 2, 5: 1, 91: 6} 
df['ethnicity'][df.year==year] = df['ethnicity'][df.year==year].map(oldNewMap) 
+0

Grazie! Ho provato questo e qualcosa di simile, ma, curiosamente, non funziona perché Python dice che "la matrice non può essere castata in sicurezza al tipo richiesto" perché hanno "lunghezza non uguale". Tuttavia, non lo fanno! Le serie sul lato destro e sinistro sono di uguale lunghezza. Forse Panda usa la lunghezza dell'intero dataframe e non la serie creata quando si affetta la sintassi dello stile np? – hmelberg

+0

@ user2040900: Funziona per me. Quale versione di Pandas stai usando? Puoi modificare la tua domanda per mostrare un esempio di cosa succede quando provi questo? – BrenBarn

+0

Vedere la modifica per esempio. Python 2.7, Pandas 0.10.1. – hmelberg

Problemi correlati