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

Pandas中如何实现SQL的JOIN ON CASE WHEN匹配逻辑?

在Pandas中为城市匹配所属区域(替代SQL多CASE WHEN)

先构造示例数据

首先用你提到的字典创建两个示例DataFrame:

import pandas as pd

# 病例数据DataFrame
disease_data = {
    '城市': ['北京', '上海', '广州', '深圳', '杭州', '南京'],
    '病例数': [120, 90, 80, 70, 50, 40]
}
disease = pd.DataFrame(disease_data)

# 区域-城市映射DataFrame
region_data = {
    '区域': ['华北', '华东', '华南'],
    '城市列表': [['北京'], ['上海', '杭州', '南京'], ['广州', '深圳']]
}
region = pd.DataFrame(region_data)

方法1:拆分区域映射表后合并(推荐)

当区域数量较多时,这种方法最简洁,无需写任何条件判断:

  1. 用explode()把region中的“城市列表”拆分为单独行,形成区域-城市的一对一映射
  2. 通过merge()将病例表和映射表按“城市”关联
# 拆分区域映射为长格式
region_long = region.explode('城市列表').rename(columns={'城市列表': '城市'})

# 左连接合并,保留所有病例数据
disease_with_region = pd.merge(disease, region_long, on='城市', how='left')

执行后disease_with_region会新增“区域”列,每个城市自动匹配对应区域。

方法2:构建映射字典后批量匹配

如果偏好字典映射的方式,可以先创建城市→区域的字典,再用map()批量赋值:

# 构建城市到区域的映射字典
city_region_map = {}
for _, row in region.iterrows():
    for city in row['城市列表']:
        city_region_map[city] = row['区域']

# 为病例表添加区域列
disease['区域'] = disease['城市'].map(city_region_map)

两种方法的优势

这两种方式都避免了SQL中写大量CASE WHEN的繁琐,尤其是区域数量增加时,只需要维护region表的结构即可,无需修改匹配逻辑。方法1更符合Pandas的向量化操作习惯,效率更高;方法2适合需要手动调整映射规则的场景。

内容的提问来源于stack exchange,提问作者PiPio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:55:42