You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中实现类似R case_when的变量重编码创建新列

Pandas实现类似R中case_when的变量重编码需求

核心问题

现有如下Pandas DataFrame:
输入表格

需要按照以下规则创建名为NewVal的新列:

  • 当((OldVal1 * OldVal2) % 3) == 0时,NewVal = OldVal2 * 100
  • 当((OldVal1 - OldVal2) % 4) == 1时,NewVal = OldVal2 + 100
  • 默认情况:NewVal = OldVal2

注:上述条件仅为示例,实际场景存在更多条件且无法完全覆盖所有情况,因此必须保留默认分支。

R语言中case_when的解决方案

在R中可通过tidyverse的case_when函数轻松实现:

# 加载tidyverse库
library(tidyverse)

# 创建数据框
my_df = as.data.frame(
  list('OldVal1'=c(1,1,1,1,2,2,2,2,3,3,3,3),
       'OldVal2'=c(1,2,3,4,5,6,7,8,9,10,11,12)))

# 使用case_when生成新列
my_df = my_df %>%
  mutate(NewVal = case_when((OldVal1 * OldVal2) %% 3 == 0 ~ OldVal2 * 100,
                            (OldVal1 - OldVal2) %% 4 == 1 ~ OldVal2 + 100,
                            .default = OldVal2))

Python中使用apply的临时方案

我通过定义辅助函数并调用apply实现了需求,但该方法繁琐且因apply本质是Python循环,在大数据集上效率极低:

# 导入pandas库
import pandas as pd

# 创建数据框
my_df = pd.DataFrame({'OldVal1':(1,1,1,1,2,2,2,2,3,3,3,3),
                      'OldVal2':(1,2,3,4,5,6,7,8,9,10,11,12)})

# 定义辅助函数
def my_colmaker(in_row):
    if (in_row['OldVal1'] * in_row['OldVal2']) % 3 == 0:
        out_cel = in_row['OldVal2'] * 100
    elif (in_row['OldVal1'] - in_row['OldVal2']) % 4 == 1:
        out_cel = in_row['OldVal2'] + 100
    else:
        out_cel = in_row['OldVal2']
    return pd.Series({'NewVal':out_cel})

# 应用函数生成新列
my_df['NewVal'] = my_df.apply(lambda in_row: my_colmaker(in_row), axis=1)

预期输出结果如下:
预期结果

疑问

是否存在更高效、更简洁的实现方式?

非重复问题说明

我了解相关Stack Overflow问题,但这些问题中新列值多为静态值(如'Easy'),可通过np.select等方法实现。而本需求中新列值依赖当前行其他列的动态计算结果,np.select无法满足,因此并非重复问题。


内容的提问来源于stack exchange,提问作者Felipe D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:23:13