如何用Pandas基于列值匹配外部列表创建geo_region新列?
为DataFrame添加匹配多区域的geo_region列
问题背景
现有如下DataFrame:
Unnamed geo_zones_pickups Delstat region 4 4 ['52102' '53101'] ['52102' '53101'] [52102, 53101] 5 5 ['52102'] ['52102'] [52102]
以及三个区域编码列表:
north = ['51101', '51105', '51100'] midt = ['52103', '52102', '52104', '52101', '52150'] south = ['53101', '53102', '53106', '53103', '53105', '53104']
需要新增geo_region列,规则为:若region列中的任一元素属于某个区域列表,则将该列表名加入geo_region,多个匹配结果用逗号分隔。期望输出如下:
Unnamed geo_zones_pickups Delstat region geo_region 4 4 ['52102' '53101'] ['52102' '53101'] [52102, 53101] midt,south 5 5 ['52102'] ['52102'] [52102] midt
补充信息:geo_zones_pickups、Delstat为object类型(元素以字符串形式存储);region同样为object类型(元素是字符串列表)。此前尝试交集方法仅能匹配单个区域,需实现多区域同时匹配的逻辑。
解决方案
方案1:基于列表匹配(通用场景)
先将区域列表整理为字典,再逐行检查region中的元素是否属于某个区域,最后拼接匹配的区域名:
import pandas as pd # 构建区域映射字典 region_mapping = { 'north': north, 'midt': midt, 'south': south } # 定义处理单行的函数 def get_matched_regions(region_list): matched = [] for region_name, code_list in region_mapping.items(): # 检查当前region列表是否有元素在目标区域编码中 if any(code in code_list for code in region_list): matched.append(region_name) return ','.join(matched) # 应用函数生成新列 df['geo_region'] = df['region'].apply(get_matched_regions)
方案2:利用前缀规则(高效优化)
题目明确给出编码前缀规则:north以511开头,midt以521开头,south以531开头,可直接通过前缀判断,无需遍历全部编码列表,效率更高:
# 构建前缀与区域名的映射 prefix_map = { '511': 'north', '521': 'midt', '531': 'south' } def get_regions_by_prefix(region_list): matched_regions = set() for code in region_list: prefix = code[:3] if prefix in prefix_map: matched_regions.add(prefix_map[prefix]) # 排序保证结果一致性,再拼接 return ','.join(sorted(matched_regions)) # 应用函数生成新列 df['geo_region'] = df['region'].apply(get_regions_by_prefix)
验证结果
两种方案均可得到符合预期的输出:
Unnamed geo_zones_pickups Delstat region geo_region 4 4 ['52102' '53101'] ['52102' '53101'] [52102, 53101] midt,south 5 5 ['52102'] ['52102'] [52102] midt
内容的提问来源于stack exchange,提问作者szuszfol
相关产品推荐
相关产品推荐

