2013-04-22 115 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