2013-04-22 22 views
9

Birkaç yıl süren bir veri çerçevem ​​var ve bir noktada etnisite için kodları değiştirdiler. Bu yüzden, sitedeki değerlerin, aynı veri çerçevesindeki başka bir sütun olan değerlerini yeniden gözden geçirmem gerekiyor. Örneğin 1, 3 ila 4 ve böylece, 2 ya da 3, 3 için:Pandalarda koşullu değiştirme

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

Ve bu da sadece aynı sütun (etnik) yıllardır diğer yıllar 1996, 2001 değerleri yapılır gerekir değiştirilmemeli.

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

Ama dataframe orijinal değerleri değişmedi: çok fazla verimsiz döngüler önlemek umuduyla, denedim. Değiştirme yönteminin kendisi değiştirilir ve yeni değerlerin doğru bir şekilde döndürülür, ancak bir koşullu uygulandığında, inplace seçeneğinin orijinal veri çerçevesini etkilemediği görülmektedir. Bu tecrübeli Pandalar kullanıcıları için açık olabilir, ama mutlaka her singel elemanı üzerinde döngü yapmak yerine bunu yapmanın basit bir yolu olmalı?

düzenleme (x2):

: Her bir de (": dizi güvenli bir şekilde gerekli tür atama edilemez TypeError '" yedek uzunluğu dizisi uzunluğu eşit olmalıdır' ve benzeri) çalışmadı Başka bir yaklaşımda bir örneğidir
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) 

Düzenleme: Bu, diğer bilgisayarımda iyi çalıştığından, yükleme/sürüme özgü bir sorun gibi görünüyor.

cevap

10

O sadece bir farklı yoldan yapmak basit olabilecek:

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

teşekkür ederiz! Bunu ve benzer bir şeyi denedim, ama merak ediyorum, işe yaramıyor çünkü Python, "dizinin gerekli türden güvenli bir şekilde üretilemediğini" çünkü "eşit olmayan uzunluklara" sahip olduklarını söylüyor. Ancak, yapmazlar! Sağ ve sol taraftaki dizi eşit uzunluktadır. Belki Panda tüm veri çerçevesinin uzunluğunu kullanır ve np stili sözdizimini kullanarak dilimleme yaparken oluşan seriyi değil? – hmelberg

+0

@ user2040900: Benim için çalışıyor. Pandaların hangi versiyonunu kullanıyorsunuz? Bunu denediğinizde neler olduğuna dair bir örnek göstermek için sorunuzu düzenleyebilir misiniz? – BrenBarn

+0

Örneğin bkz. Python 2.7, Pandalar 0.10.1. – hmelberg