如何从另一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_ID | Away_Team_ID | Home_City | Away_City |
|---|---|---|---|
| NYY | DET | New York, NY | Detroit, MI |
| PIT | BOS | Pittsburgh, PA | Boston, 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
相关产品推荐
相关产品推荐

