如何判断DataFrame地址是否包含对应区域的城市字符串(循环实现失败)
解决DataFrame地址与对应区域城市匹配问题
问题背景
现有两个Pandas DataFrame:cities 存储区域与对应城市的映射,addresses 存储区域与地址信息。需要给 addresses 新增一列 check,规则为:
- 当该行的
region与cities中的region匹配,且address字符串包含该区域对应的任意一个city字符串时,标记为True - 否则标记为
False
原DataFrame定义:
import pandas as pd cities = pd.DataFrame({'region': {0: 'region_1', 1: 'region_1', 2: 'region_2'}, 'city': {0: 'city_1', 1: 'city_2', 2: 'city_3'}}, columns=['city', 'region']) addresses = pd.DataFrame({'region': {0: 'region_1', 1: 'region_2', 2: 'region_1'}, 'address': {0: 'adress_1', 1: 'adress_2', 2: 'adress_3'}}, columns=['region', 'address'])
原代码错误分析
你提供的代码存在以下关键问题:
- 分组时引用了不存在的列
['name'],实际应该用['city'] reset_index参数使用错误,无法正确重命名列- 循环逻辑错误:遍历字符串列表
['region', 'address']并试图给字符串添加字典键,不符合语法规则 - 直接用
&连接str.findall的列表结果,无法实现逻辑与判断,且未关联对应区域的城市,而是匹配所有城市
正确实现方案
方案1:构建区域-城市映射后逐行匹配
适合中小数据量,逻辑直观:
import pandas as pd # 构建区域到对应城市列表的字典 region_cities = cities.groupby('region')['city'].agg(list).to_dict() # 定义匹配函数 def check_address(row): # 获取当前行区域对应的城市列表 city_list = region_cities.get(row['region'], []) # 检查地址是否包含任意一个对应城市 return any(city in row['address'] for city in city_list) # 新增check列 addresses['check'] = addresses.apply(check_address, axis=1)
方案2:合并+分组匹配(大数据量更高效)
避免逐行遍历,利用Pandas向量操作优化效率:
import pandas as pd # 按region合并两个DataFrame,得到每行地址对应的所有同区域城市 merged = addresses.merge(cities, on='region', how='left') # 检查每个地址是否包含对应城市,再按原地址行分组取任意匹配结果 merged['match'] = merged['address'].str.contains(merged['city']) addresses['check'] = merged.groupby(addresses.index)['match'].any()
测试示例
若修改addresses的地址为包含对应城市的内容:
addresses.loc[0, 'address'] = 'city_1_street' addresses.loc[1, 'address'] = 'city_3_road'
运行代码后,addresses['check']会返回[True, True, False],符合预期规则。
内容的提问来源于stack exchange,提问作者ElenaU
相关产品推荐
相关产品推荐

