如何在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.
相关产品推荐
相关产品推荐

