You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:52:50