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

如何从另一DataFrame匹配ID与值,为Baseball_Games添加城市列?

嘿,这个需求我之前处理过好几次,在pandas里有两种很实用的方法,看你更倾向哪种:

首先先把示例数据构造出来,方便你直接测试:

import pandas as pd

# 构造Baseball_ID数据
Baseball_ID = pd.DataFrame({
    'Team_ID': ['BOS', 'DET', 'NYY', 'PIT'],
    'City': ['Boston, MA', 'Detroit, MI', 'New York, NY', 'Pittsburgh, PA']
})

# 构造Baseball_Games数据(包含待填充的对阵信息)
Baseball_Games = pd.DataFrame({
    'Home_Team_ID': ['NYY', 'PIT'],
    'Away_Team_ID': ['DET', 'BOS']
})

方法1:使用map()函数(简单直接)

这种方法最适合一对一映射的场景,效率也很高。我们先把Baseball_ID转换成一个Team_ID到City的映射关系,然后直接用map填充列:

# 创建Team_ID到City的映射Series
city_mapping = Baseball_ID.set_index('Team_ID')['City']

# 填充Home_City和Away_City
Baseball_Games['Home_City'] = Baseball_Games['Home_Team_ID'].map(city_mapping)
Baseball_Games['Away_City'] = Baseball_Games['Away_Team_ID'].map(city_mapping)

运行后你会得到填充好的结果:

Home_Team_IDAway_Team_IDHome_CityAway_City
NYYDETNew York, NYDetroit, MI
PITBOSPittsburgh, PABoston, MA

方法2:使用merge()函数(灵活扩展)

如果你之后需要关联更多球队相关的字段(比如球队昵称、主场场馆等),merge会更灵活。我们可以分两次合并,分别填充主场和客场的城市:

# 第一次合并:填充Home_City
Baseball_Games = Baseball_Games.merge(
    Baseball_ID.rename(columns={'City': 'Home_City'}),  # 重命名City避免冲突
    left_on='Home_Team_ID',
    right_on='Team_ID',
    how='left'  # 左连接保证所有比赛记录都保留
).drop('Team_ID', axis=1)  # 删除多余的Team_ID列

# 第二次合并:填充Away_City
Baseball_Games = Baseball_Games.merge(
    Baseball_ID.rename(columns={'City': 'Away_City'}),
    left_on='Away_Team_ID',
    right_on='Team_ID',
    how='left'
).drop('Team_ID', axis=1)

这种方法的好处是,后续如果Baseball_ID新增了其他字段,你只需要调整rename的部分,就能一次性关联多个字段,扩展性更强。

小提示

  • 如果Baseball_ID里的Team_ID是唯一值,两种方法都能得到相同的结果;
  • 如果Team_ID有重复,map会取最后一个匹配的City值,而merge会生成多行记录,这时候你需要先处理Baseball_ID的重复值问题。

内容的提问来源于stack exchange,提问作者berkshire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:28:47