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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:48:18