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:拆分区域映射表后合并(推荐)
当区域数量较多时,这种方法最简洁,无需写任何条件判断:
- 用
explode()把region中的“城市列表”拆分为单独行,形成区域-城市的一对一映射 - 通过
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
相关产品推荐
相关产品推荐

