如何在Python的pandas中复现SQL的Update CASE WHEN逻辑
需求逻辑梳理
首先拆解你提供的SQL更新逻辑,所有分支可简化为:Column1优先取Column3的值,只有当Column3为空时才取Column2的值,和Column2本身是否为空没有直接关联,和原SQL逐分支执行结果完全一致。
实现方案
你可以根据自己的使用习惯选择以下任意一种实现方式:
- 最简写法(最推荐)
直接用fillna填充空值,完全匹配简化后的逻辑:
import pandas as pd # 假设你的数据表存储在变量df中 df['Column1'] = df['Column3'].fillna(df['Column2'])
- 通用逻辑写法
用np.where实现条件判断,可读性更高,也方便后续调整逻辑:
import pandas as pd import numpy as np df['Column1'] = np.where( df['Column3'].isna(), # 条件:Column3为空 df['Column2'], # 满足条件时取Column2 df['Column3'] # 不满足条件时取Column3 )
- 逐分支匹配写法
如果你需要完全对应原SQL的每一个CASE分支,避免逻辑简化带来的偏差,可以用pandas提供的case方法逐行匹配:
import pandas as pd df['Column1'] = pd.case( [ (df['Column2'].isna() & df['Column3'].isna(), df['Column3']), (df['Column2'].notna() & df['Column3'].isna(), df['Column2']), (df['Column2'].isna() & df['Column3'].notna(), df['Column3']), (df['Column2'].notna() & df['Column3'].notna(), df['Column3']) ], default=df['Column3'] )
注意事项
pandas中的空值(对应SQL的NULL)包含NaN、NaT等类型,判断空值时请使用isna()、notna()方法,不要使用== np.nan的写法,该写法会因为NaN不等于自身的特性得到错误的判断结果。
内容的提问来源于stack exchange,提问作者progammerattempt
相关产品推荐
相关产品推荐

