熊猫中的条件替换

Posted

技术标签:

【中文标题】熊猫中的条件替换【英文标题】:Conditional replacement in pandas 【发布时间】:2013-04-15 17:36:51 【问题描述】:

我有一个跨越几年的数据框,并且在某些时候他们更改了种族代码。所以我需要重新编码以年份为条件的值 - 这是同一数据框中的另一列。例如 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】:

换一种方式可能会更简单:

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 样式语法切片时创建的系列? @user2040900:它对我有用。你用的是什么版本的熊猫?您能否编辑您的问题以显示尝试此操作时会发生什么的示例? @user2040900:嗯,奇怪。它适用于 0.11dev。您可以尝试使用df.ix[df.year==year, 'ethnicity'] 访问元素吗? 我在第二台电脑 Python 2.7、Pandas 0.9.1 上试了一下。一切正常。相同的代码在另一台计算机上生成了上述错误(相同的 Python 版本,更新的 Pandas)。可能是特定于计算机/安装的问题。谢谢你帮我解决这个问题。

以上是关于熊猫中的条件替换的主要内容,如果未能解决你的问题,请参考以下文章

用另一个值替换熊猫数据框列中的几个值

熊猫一次替换多个列的内容以适应多个条件

熊猫替换为默认值

使用字典替换熊猫数据框中的单词

替换熊猫索引对象中的字符串元素

替换熊猫数据框中的列表元素