2013-04-22 14 views
9

Ich habe einen Datenrahmen über mehrere Jahre und irgendwann änderten sie die Codes für ethnische Zugehörigkeit. Also muss ich die Werte für das Jahr rekodieren - das ist eine andere Spalte im selben Datenrahmen. Zum Beispiel 1 bis 3, 2 bis 3, 3 bis 4 und so weiter:Bedingte Ersatz in Pandas

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

Und dies ist nur für die Jahre 1996 bis 2001. Die Werte für die anderen Jahre in der gleichen Spalte (Ethnizität) erfolgen muss nicht geändert werden. In der Hoffnung, zu viele ineffiziente Schleifen zu vermeiden, habe ich versucht:

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

Aber die ursprünglichen Werte im Dataframe haben sich nicht geändert. Die replace-Methode selbst hat die neuen Werte korrekt ersetzt und zurückgegeben, aber die Option inplace scheint den ursprünglichen Datenrahmen nicht zu beeinflussen, wenn eine Bedingung angewendet wird. Dies kann für erfahrene Pandas-Benutzer offensichtlich sein, aber sicherlich muss es einen einfachen Weg geben, dies zu tun, anstatt jedes einzelne Element zu durchlaufen.

Edit (x2): Her ist ein Beispiel für einen anderen Ansatz, der auch nicht funktioniert (und ‚Länge des Ersatzes muss Serienlänge gleich‘ „Typeerror: Array kann nicht sicher auf die gewünschte Art gegossen werden“):

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) 

Edit: Es scheint ein Problem für die Installation/Version zu sein, da dies auf meinem anderen Computer funktioniert.

Antwort

10

Es kann nur einfacher sein es eine andere Art und Weise zu tun:

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

Thank you! Ich habe dies und etwas Ähnliches versucht, aber merkwürdigerweise funktioniert es nicht, weil Python sagt, dass "das Array nicht sicher zum erforderlichen Typ umgewandelt werden kann", weil sie "ungleiche Länge" haben. Sie tun es jedoch nicht! Die Reihen auf der rechten und linken Seite sind gleich lang. Vielleicht verwendet Panda die Länge des gesamten Datenrahmens und nicht die Serie, die beim Schneiden mit np-Stilsyntax erstellt wurde? – hmelberg

+0

@ user2040900: Es funktioniert für mich. Welche Version von Pandas benutzt du? Können Sie Ihre Frage bearbeiten, um ein Beispiel zu zeigen, was passiert, wenn Sie dies versuchen? – BrenBarn

+0

Siehe zum Beispiel bearbeiten. Python 2.7, Pandas 0.10.1. – hmelberg