如何用Python或Pandas实现多DataFrame多列的SQL Case逻辑
Pandas实现SQL CASE语句逻辑方案
下面提供两种完全匹配需求的实现方法,与你给出的SQL CASE执行逻辑完全一致:
方法1:嵌套np.where实现顺序判断
利用np.where的三元表达式特性,嵌套实现多条件的顺序匹配(优先触发第一个满足的条件,和SQL CASE逻辑一致)
示例代码
import pandas as pd import numpy as np # 构造示例数据(替换为你的真实数据即可) df = pd.DataFrame({ 'p0': ['ON', 'OFF', 'ON', 'OFF'], 'p1': ['OFF', 'OFF', 'ON', 'OFF'], 'p2': ['ON', 'OFF', 'OFF', 'OFF'], 'rate': [0.5, 0.8, 0.3, 0.6] }) df1 = pd.DataFrame({'value': [100, 200, 300, 400]}) df2 = pd.DataFrame({'value_total': [500, 600, 700, 800]}) # 实现CASE逻辑 df['projected_value'] = np.where( # 第一个条件:p0=ON 且 p1=OFF (df['p0'] == 'ON') & (df['p1'] == 'OFF'), df1['value'] * df['rate'], # 第一个条件不满足时,判断第二个条件 np.where( # 第二个条件:p1=OFF 且 p2=OFF (df['p1'] == 'OFF') & (df['p2'] == 'OFF'), df2['value_total'], # 都不满足时返回0 0 ) )
方法2:使用loc分步赋值
通过初始化默认值,再按条件优先级依次赋值,保证逻辑顺序的正确性
示例代码
import pandas as pd # 构造示例数据(替换为你的真实数据即可) df = pd.DataFrame({ 'p0': ['ON', 'OFF', 'ON', 'OFF'], 'p1': ['OFF', 'OFF', 'ON', 'OFF'], 'p2': ['ON', 'OFF', 'OFF', 'OFF'], 'rate': [0.5, 0.8, 0.3, 0.6] }) df1 = pd.DataFrame({'value': [100, 200, 300, 400]}) df2 = pd.DataFrame({'value_total': [500, 600, 700, 800]}) # 初始化默认值为0 df['projected_value'] = 0 # 先赋值优先级低的条件(避免被高优先级结果覆盖) df.loc[(df['p1'] == 'OFF') & (df['p2'] == 'OFF'), 'projected_value'] = df2['value_total'] # 再赋值优先级高的条件(覆盖重叠行的结果) df.loc[(df['p0'] == 'ON') & (df['p1'] == 'OFF'), 'projected_value'] = df1['value'] * df['rate']
关键注意事项
- 确保
df、df1、df2的行数完全一致,否则会因索引不匹配报错;若行数不同,需先通过reset_index()等方法对齐索引。 - Pandas中Series的逻辑与运算必须用
&,不能用Python内置的and,且每个条件需用括号包裹,避免运算符优先级问题。
内容的提问来源于stack exchange,提问作者Upendra Kumar
相关产品推荐
相关产品推荐

