2013-04-22 113 views
9

我有一個跨越數年的數據框,並在某些時候改變了種族的代碼。因此,我需要重新編碼這一年的值 - 這是同一數據框中的另一列。例如1至3,2〜3個,3到4等:有條件的熊貓替換

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

而這僅是在同一列(種族)做了多年的1996年至2001年的其他年份的值必須不會改變。希望避免過多低效的循環,我想:

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

但在數據幀中的原始值沒有改變。替換方法本身替換並正確返回新值,但inplace選項在應用條件時似乎不會影響原始數據框。對於有經驗的熊貓用戶來說,這可能是顯而易見的,但是肯定必須有一些簡單的方法來做到這一點,而不是循環遍歷每一個singel元素?

編輯(X2):她是一個的另一種方法也沒有工作(「替換的長度必須等於系列長度」和「類型錯誤:陣列不能安全地轉換到所需的類型」):一個例子

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) 

編輯:這似乎是一個特定於安裝/版本的問題,因爲這可以在我的另一臺計算機上正常工作。

回答

10

這可能只是簡單的做它用不同的方式:

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

謝謝!我嘗試了這個和類似的東西,但是,奇怪的是,它不起作用,因爲Python說「數組不能安全地轉換爲所需的類型」,因爲它們具有「不等長度」。但是,他們不!右側和左側的系列長度相等。也許熊貓使用整個數據幀的長度,而不是使用np樣式語法進行切片時創建的系列? – hmelberg 2013-04-22 18:15:02

+0

@ user2040900:它適用於我。你使用的是什麼版本的熊貓?你可以編輯你的問題來展示一個當你嘗試這個時會發生什麼的例子嗎? – BrenBarn 2013-04-22 18:27:27

+0

請參閱編輯例如。 Python 2.7,Pandas 0.10.1。 – hmelberg 2013-04-22 19:34:28