Python对比两列生成新列:寻求更具可读性的类SAS实现方案
高可读性Pandas新列赋值实现方案
你需要的判断逻辑非常清晰,不需要依赖np.select也能写出和SAS语法逻辑类似、易读易维护的代码,以下是几种常用实现方式:
方案1:布尔值直接转整数(最简洁)
逻辑说明:Pandas中布尔值
True默认对应整数1,False对应整数0,直接把判断结果转换为int类型即可实现需求
import pandas as pd df = pd.DataFrame({'id': [1,2,3,4,5,6,7,8,9], 'In': [111, 100, 31, 1100, 12, 33, 21, 32, 33], 'Out': [24, 52, 34, 95, 98, 54, 32, 20, 16]}) # 一行完成赋值,逻辑一目了然 df['check'] = (df['In'] > df['Out']).astype(int) print(df)
方案2:where方法(和SAS的if/else语法逻辑最接近)
逻辑说明:
where(判断条件, 不满足条件时的赋值)的写法和SAS的if分支逻辑完全对应,就算后续要增加判断条件也很好维护
# 写法和SAS的if/else步骤完全一致 df['check'] = 1 df['check'] = df['check'].where(df['In'] > df['Out'], 0) # 也可以压缩为一行写法 df['check'] = (df['In'] > df['Out']).where(True, 0)
方案3:自定义函数+apply(可读性最高,适合复杂逻辑扩展)
逻辑说明:把判断逻辑全部封装在自定义函数里,每一步都可以单独加注释,后续要新增分支条件只需要修改函数即可,和SAS的data step逻辑完全对齐
def cal_check(row): # 对应SAS逻辑:if In > Out then check=1 if row['In'] > row['Out']: return 1 # 对应SAS逻辑:else check=0 else: return 0 df['check'] = df.apply(cal_check, axis=1)
内容的提问来源于stack exchange,提问作者Hary2
相关产品推荐
相关产品推荐

