基于DataFrame现有列与列表创建新列的实现问题
解决DataFrame根据赛道名称生成对应国家列的问题
问题说明
现有包含多列的DataFrame,其中TName列存储赛道名称,需要新增Country列来存储每条赛道对应的国家。原代码最后两行逻辑有误,无法实现需求。
原代码:
austracks = ['Ascot', 'Balnarring'] nztracks = ['Te Aura'] hktracks = ['Sha Tin'] singtracks = ['Singapore'] df['Country'] = df['TName'] (["AUS" for c in austracks] + ["NZ" for c in nztracks] + ["HK" for c in nztracks] + ["SING" for c in nztracks])
期望结果:
| TName | Country |
|---|---|
| Ascot | AUS |
| Balnarring | AUS |
| Te Aura | NZ |
解决方案
方法1:使用映射字典(推荐,易维护)
先建立赛道名称到国家的映射关系,再通过map方法生成新列:
# 方式1:直接定义映射字典 track_country_map = { 'Ascot': 'AUS', 'Balnarring': 'AUS', 'Te Aura': 'NZ', 'Sha Tin': 'HK', 'Singapore': 'SING' } # 方式2:从已有赛道列表动态生成映射字典 austracks = ['Ascot', 'Balnarring'] nztracks = ['Te Aura'] hktracks = ['Sha Tin'] singtracks = ['Singapore'] track_country_map = {} track_country_map.update({track: 'AUS' for track in austracks}) track_country_map.update({track: 'NZ' for track in nztracks}) track_country_map.update({track: 'HK' for track in hktracks}) track_country_map.update({track: 'SING' for track in singtracks}) # 生成Country列 df['Country'] = df['TName'].map(track_country_map)
方法2:使用numpy.select(适合多条件判断)
通过条件列表和对应结果列表,批量完成赋值:
import numpy as np austracks = ['Ascot', 'Balnarring'] nztracks = ['Te Aura'] hktracks = ['Sha Tin'] singtracks = ['Singapore'] # 定义条件和对应结果 conditions = [ df['TName'].isin(austracks), df['TName'].isin(nztracks), df['TName'].isin(hktracks), df['TName'].isin(singtracks) ] choices = ['AUS', 'NZ', 'HK', 'SING'] # 生成Country列,未匹配到的内容设为NaN df['Country'] = np.select(conditions, choices, default=np.nan)
原代码问题解析
原代码最后两行逻辑错误:直接将df['TName']赋值给df['Country']后,多余的列表拼接语句没有和赛道名称建立对应关系,无法实现按赛道匹配国家的需求。
内容的提问来源于stack exchange,提问作者onthepunt
相关产品推荐
相关产品推荐

