Python中DataFrame匹配城市ID并分配对应名称的实现问题
城市ID匹配城市名称的解决方案
我有一份城市信息表(含城市ID与对应名称)和一份用户数据表(含用户信息及关联城市ID),需要将城市表中的对应名称匹配到用户表的城市ID字段中。尝试用循环求交集的方法没得到预期效果,还要处理单个用户关联多个城市ID的场景,无匹配时要显示“no record”。
单个城市ID匹配场景
初始代码问题
原代码遍历的是DataFrame的列名而非行,且求交集的逻辑无法实现逐行匹配,导致结果不符合预期。
正确实现代码
import pandas as pd # 构建城市映射表 city_data = [["LN", "London"], ["NY", "New York"], ["LE", "Leeds"]] cities = pd.DataFrame(city_data, columns=['ID','City']) # 转成字典实现快速查找 city_dict = cities.set_index('ID')['City'].to_dict() # 用户数据表 user_data = [['Tom', 10, 'LN'], ['Nick', 15, 'XX'], ['Juli', 14, 'YY']] user_df = pd.DataFrame(user_data, columns=['Name', 'Age', 'Adress']) # 匹配城市名称,无匹配项填充"no record" user_df['Result'] = user_df['Adress'].map(city_dict).fillna('no record') print(user_df)
预期输出
Name Age Adress Result 0 Tom 10 LN London 1 Nick 15 XX no record 2 Juli 14 YY no record
多个城市ID匹配场景
当用户的Adress字段包含多个用逗号分隔的城市ID时,需要按顺序逐个匹配,无匹配项保留“no record”。
正确实现代码
import pandas as pd # 构建城市映射表 city_data = [["LN", "London"], ["NY", "New York"], ["LE", "Leeds"]] cities = pd.DataFrame(city_data, columns=['ID','City']) city_dict = cities.set_index('ID')['City'].to_dict() # 带多城市ID的用户数据表 user_data = [['Tom', 10, 'LN, LE, XX'], ['Nick', 15, 'XX, LE'], ['Juli', 14, 'YY, LN']] user_df = pd.DataFrame(user_data, columns=['Name', 'Age', 'Adress']) # 定义多ID匹配函数 def match_multiple_cities(addr_str): # 拆分并去除每个ID的空格 city_ids = [city_id.strip() for city_id in addr_str.split(',')] # 逐个匹配,无匹配返回"no record" matched_names = [city_dict.get(city_id, 'no record') for city_id in city_ids] # 拼接成字符串 return ', '.join(matched_names) # 应用函数生成结果列 user_df['Result'] = user_df['Adress'].apply(match_multiple_cities) print(user_df)
预期输出
Name Age Adress Result 0 Tom 10 LN, LE, XX London, Leeds, no record 1 Nick 15 XX, LE no record, Leeds 2 Juli 14 YY, LN no record, London
内容的提问来源于stack exchange,提问作者314mip
相关产品推荐
相关产品推荐

