在pandas中进行条件替换

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)

但数据框中的原始值并未改变。 replace方法本身正确地替换并返回了新的值,但是在应用条件时,inplace选项似乎不会影响原始数据框。这对经验丰富的Pandas用户可能很明显,但肯定有一些简单的方法来代替遍历每个单独元素吗?
编辑(x2):这里是另一种方法的示例,也没有起作用(“替换的长度必须等于系列长度”和“TypeError:数组不能安全地转换为所需类型”):
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)

编辑:看起来这似乎是安装/版本特定的问题,因为在我的另一台电脑上它可以正常工作。
1个回答

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)

谢谢!我尝试了这个以及类似的方法,但奇怪的是不管怎么试都失败了。Python提示说“数组无法安全地转换为所需类型”,因为它们的长度不相等。然而,实际上它们却是相等的。也许Panda使用整个数据帧的长度而不是使用np样式语法进行切片后创建的系列的长度? - hmelberg
@user2040900:这对我有效。你使用的Pandas版本是什么?你能否编辑你的问题,展示一下当你尝试这个时会发生什么? - BrenBarn
@user2040900:嗯,奇怪。在0.11dev中可以工作。你能否尝试使用df.ix[df.year==year, 'ethnicity']访问元素? - BrenBarn
我在另一台电脑上尝试了一下,使用的是Python 2.7和Pandas 0.9.1,一切都正常。但是在另一台电脑上(同样的Python版本,更新的Pandas),相同的代码却出现了错误。可能是特定于该计算机/安装的问题。感谢您帮助我解决这个问题。 - hmelberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接