2013-04-22 8 views
9

Posiadam ramkę danych obejmującą kilka lat iw pewnym momencie zmieniły kody dla grupy etnicznej. Muszę więc przekodować wartości zależnie od roku - co jest kolejną kolumną w tej samej ramce danych. Na przykład od 1 do 3, 2 do 3, 3 do 4 i tak dalej:Warunkowa wymiana w pandach

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

i odbywa się to tylko w latach 1996 do 2001. Wartości dla innych lat w tej samej kolumnie (etniczna) musi nie być zmienionym. Mając nadzieję uniknąć zbyt wielu nieefektywnych pętli, próbowałem:

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

Ale pierwotne wartości w ramie danych nie zmieniły się. Sama metoda replace zastąpiła i zwróciła poprawnie nowe wartości, ale opcja inplace wydaje się nie wpływać na oryginalną ramkę danych podczas stosowania warunkowego. Może to być oczywiste dla doświadczonych użytkowników Pand, ale z pewnością musi być jakiś prosty sposób na zrobienie tego zamiast pętli nad każdym elementem singel?

Edit (x2): Ona jest przykładem innego podejścia, które również nie działa („Długość zamienników musi być równa długości serii” i „Błąd typu: array nie można bezpiecznie oddanych do wymaganego typu”):

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) 

Edycja: Wydaje się, że jest to problem związany z instalacją/wersją, ponieważ działa to dobrze na moim drugim komputerze.

Odpowiedz

10

To może być po prostu prościej zrobić to w inny sposób:

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

Dziękujemy! Próbowałem tego i coś podobnego, ale, co ciekawe, to nie działa, ponieważ Python mówi, że "tablica nie może być bezpiecznie rzucona do wymaganego typu", ponieważ mają "nierówną długość". Jednak nie robią tego! Serie po prawej i lewej stronie mają taką samą długość. Może Panda używa długości całej ramki danych, a nie serii tworzonej podczas krojenia za pomocą składni stylów np? – hmelberg

+0

@ user2040900: To działa dla mnie. Z jakiej wersji Pandy korzystasz? Czy możesz edytować swoje pytanie, aby pokazać przykład tego, co się stanie, gdy spróbujesz tego? – BrenBarn

+0

Patrz edytuj na przykład. Python 2.7, Pandy 0.10.1. – hmelberg