如何基于字典映射DataFrame数组列的值生成对应新列
问题
基于给定的城市-国家映射字典,为DataFrame中数组类型的Cities列生成对应的Country列:将Cities数组内的每个城市映射为字典对应的国家,无匹配项则设为None。
映射字典
{ 'Paris': 'France', 'Amsterdam': 'Netherlands', 'Lisboa': 'Portugal', 'London': 'United Kingdom', 'Madrid': 'Spain', 'Berlin': 'Germany', 'Vienna': 'Austria' }
原始DataFrame
| First_col | Cities |
|---|---|
| First_value | ['Paris', 'Lisboa', 'Barcelona'] |
| Second_value | ['Amsterdam', 'Madrid'] |
| Third_value | ['Lisboa', 'London', 'Amsterdam', 'Milan', 'Prague'] |
| Fourth_value | ['Rome', 'Lyon', 'Vienna'] |
期望输出
| First_col | Cities | Country |
|---|---|---|
| First_value | ['Paris', 'Lisboa', 'Barcelona'] | ['France', 'Portugal', None] |
| Second_value | ['Amsterdam', 'Madrid'] | ['Netherlands', 'Spain'] |
| Third_value | ['Lisboa', 'London', 'Amsterdam', 'Milan', 'Prague'] | ['Portugal', 'United Kingdom', 'Netherlands', None, None] |
| Fourth_value | ['Rome', 'Lyon', 'Oslo'] | [None, None, None] |
(注:原始期望输出中存在两处笔误:Third_value的Country列最后一个值误写为'Vienna';Fourth_value的Cities列与原始数据不一致,上述为修正后的合理期望)
解决方案
使用pandas的apply方法结合列表推导式,通过字典的get方法实现批量映射:
完整代码
import pandas as pd # 定义映射字典 city_country_map = { 'Paris': 'France', 'Amsterdam': 'Netherlands', 'Lisboa': 'Portugal', 'London': 'United Kingdom', 'Madrid': 'Spain', 'Berlin': 'Germany', 'Vienna': 'Austria' } # 构建原始DataFrame df = pd.DataFrame({ 'First_col': ['First_value', 'Second_value', 'Third_value', 'Fourth_value'], 'Cities': [ ['Paris', 'Lisboa', 'Barcelona'], ['Amsterdam', 'Madrid'], ['Lisboa', 'London', 'Amsterdam', 'Milan', 'Prague'], ['Rome', 'Lyon', 'Vienna'] ] }) # 生成Country列 df['Country'] = df['Cities'].apply(lambda cities: [city_country_map.get(city, None) for city in cities]) # 查看结果 print(df)
代码解释
df['Cities'].apply(...):遍历Cities列的每个数组元素lambda cities: [...]:对每个城市数组,逐个执行映射逻辑city_country_map.get(city, None):从字典中获取城市对应的国家,若城市不在字典中则返回None
运行输出
First_col Cities Country 0 First_value [Paris, Lisboa, Barcelona] [France, Portugal, None] 1 Second_value [Amsterdam, Madrid] [Netherlands, Spain] 2 Third_value [Lisboa, London, Amsterdam, Milan, Prague] [Portugal, United Kingdom, Netherlands, None, None] 3 Fourth_value [Rome, Lyon, Vienna] [None, None, Austria]
内容的提问来源于stack exchange,提问作者jabeono
相关产品推荐
相关产品推荐

