Python中如何实现SQL的case when语句效果完成pandas数据分箱?
pandas实现SQL case when分箱逻辑的解决方案
- 方案1:直接扩展原有lambda三元表达式(改动最小)
你可以直接在原有lambda的else分支中嵌套新的三元判断,适配多分支逻辑:
df['company_size'] = df['site_visits'].apply(lambda x: 'Small' if x < 300 else 'Medium' if x < 600 else 'Large')
该方法适合分支较少的场景,无需引入其他依赖,直接修改原有代码即可生效。
- 方案2:使用
np.where嵌套(逻辑和SQL完全对齐)
对于有SQL使用背景的用户,np.where嵌套的逻辑和case when完全一致,写法相似度很高:
import numpy as np df['company_size'] = np.where( df['site_visits'] < 300, 'Small', np.where(df['site_visits'] < 600, 'Medium', 'Large') )
执行效率远高于apply方法,逻辑清晰容易排查问题。
- 方案3:使用
pd.cut(区间分箱场景最优解)
你的需求属于典型的连续值区间分箱场景,使用pandas内置的分箱函数pd.cut是性能最高、代码最简洁的实现方式:
df['company_size'] = pd.cut( x=df['site_visits'], bins=[-1, 299, 599, 1000], # 适配默认左开右闭规则,包含0和1000两个边界值 labels=['Small', 'Medium', 'Large'] )
如果需要调整区间开闭规则,可以添加right=False参数修改为左闭右开,对应调整bins参数即可。
- 方案4:使用pandas原生
case_when(pandas 1.3.0+版本支持)
pandas后续版本新增了原生case_when方法,语法和SQL的case when几乎完全一致,可读性最高,多分支场景下易维护:
df['company_size'] = df['site_visits'].case_when( [ (df['site_visits'] < 300, "Small"), (df['site_visits'].between(300, 599), "Medium"), (df['site_visits'] >= 600, "Large") ] )
内容的提问来源于stack exchange,提问作者Zack Tobin
相关产品推荐
相关产品推荐

