如何用另一DataFrame字段值替换当前DataFrame指定列值?
替换DataFrame中homeground列值为对应id_city的解决方案
需求说明
将student DataFrame的homeground列值替换为hg对照表中对应的id_city,空值替换为0,最终结果匹配给定示例。
原始数据
import pandas as pd student = pd.DataFrame({'id': [1,2,3,4,5,6,7,8,9,10], 'homeground': ['TOKYO','SOUTH KOREA','RIYADH','JAPAN','TOKYO','OSAKA','SAUDI ARABIA','SEOUL','','BUSAN']}) hg = pd.DataFrame({'id_country':[1,2,2,3,3,3,3], 'country': ['SAUDI ARABIA','SOUTH KOREA','SOUTH KOREA','JAPAN','JAPAN','JAPAN','JAPAN'], 'id_city':[1,2,3,4,5,6,7], 'city': ['RIYADH','SEOUL','BUSAN','TOKYO','TOKYO','OSAKA','OSAKA']})
解决方案
- 构建映射字典:从
hg中分别提取城市、国家与id_city的对应关系,保留每个名称首次出现的id_city(匹配示例规则) - 替换并处理空值:用映射字典替换
homeground的值,空值填充为0并转为整数类型
# 构建城市到id_city的映射(去重保留第一个匹配项) city_map = hg.drop_duplicates(subset='city', keep='first').set_index('city')['id_city'].to_dict() # 构建国家到id_city的映射(去重保留第一个匹配项) country_map = hg.drop_duplicates(subset='country', keep='first').set_index('country')['id_city'].to_dict() # 合并映射,城市优先级高于国家(若名称重叠优先用城市映射) full_map = {**country_map, **city_map} # 替换homeground列,空值填充为0并转为整数 student['homeground'] = student['homeground'].replace(full_map).fillna(0).astype(int) # 输出结果 print(student)
输出结果
id homeground 0 1 4 1 2 2 2 3 1 3 4 4 4 5 4 5 6 6 6 7 1 7 8 2 8 9 0 9 10 3
说明
若需要调整映射规则(比如国家对应其他id_city),可修改drop_duplicates的keep参数(如keep='last'取最后一个匹配项),或手动调整映射字典的键值对。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

