如何将DataFrame A的得分数据匹配合并到DataFrame B?
Pandas合并DataFrame得分数据解决方案
问题描述
需将DataFrame A的得分数据匹配填充到DataFrame B的away_score和home_score字段中。
原始数据
DataFrame A:
game_id team_id score 0 2000020001 21 39.703125 1 2000020001 25 38.386148 2 2000020002 6 35.527686 3 2000020002 9 45.862678 4 2000020003 7 35.376138 5 2000020003 7 32.786932
DataFrame B:
away_team_id home_team_id away_score home_score game_id 2000020001 21 25 2000020002 6 9 2000020003 7 4
期望结果:
away_team_id home_team_id away_score home_score game_id 2000020001 21 25 39.703125 38.386148 2000020002 6 9 35.527686 45.862678 2000020003 7 4 35.376138 32.786932
实现步骤与代码
思路
提供两种实现逻辑,可根据数据实际情况选择:
- 基础版:假设DataFrame A中同一赛事的得分顺序与DF B的客场、主场顺序完全对应,直接按赛事分组匹配。
- 严谨版:通过球队ID精准匹配得分,不受得分顺序影响。
基础版代码(依赖得分顺序)
import pandas as pd # 构造示例数据(已有真实数据可跳过此部分) df_a = pd.DataFrame({ 'game_id': [2000020001, 2000020001, 2000020002, 2000020002, 2000020003, 2000020003], 'team_id': [21, 25, 6, 9, 7, 7], 'score': [39.703125, 38.386148, 35.527686, 45.862678, 35.376138, 32.786932] }) df_b = pd.DataFrame({ 'away_team_id': [21, 6, 7], 'home_team_id': [25, 9, 4] }, index=[2000020001, 2000020002, 2000020003]) df_b.index.name = 'game_id' df_b[['away_score', 'home_score']] = None # 1. 重置df_b索引,将game_id转为普通列 df_b = df_b.reset_index() # 2. 构建赛事ID到得分列表的映射 score_map = df_a.groupby('game_id')['score'].apply(list).to_dict() # 3. 按顺序填充客场、主场得分 df_b['away_score'] = df_b['game_id'].map(lambda x: score_map[x][0]) df_b['home_score'] = df_b['game_id'].map(lambda x: score_map[x][1]) # 4. 恢复game_id为索引 df_b = df_b.set_index('game_id') # 查看结果 print(df_b)
严谨版代码(按球队ID匹配)
如果DataFrame A的得分顺序不固定,推荐使用此逻辑,通过球队ID精准匹配:
import pandas as pd # 构造示例数据(已有真实数据可跳过此部分) df_a = pd.DataFrame({ 'game_id': [2000020001, 2000020001, 2000020002, 2000020002, 2000020003, 2000020003], 'team_id': [21, 25, 6, 9, 7, 7], 'score': [39.703125, 38.386148, 35.527686, 45.862678, 35.376138, 32.786932] }) df_b = pd.DataFrame({ 'away_team_id': [21, 6, 7], 'home_team_id': [25, 9, 4] }, index=[2000020001, 2000020002, 2000020003]) df_b.index.name = 'game_id' df_b[['away_score', 'home_score']] = None # 1. 重置df_b索引,将game_id转为普通列 df_b = df_b.reset_index() # 2. 构建(赛事ID+球队ID)到得分的映射 team_score_map = df_a.set_index(['game_id', 'team_id'])['score'].to_dict() # 3. 按球队ID匹配填充得分 df_b['away_score'] = df_b.apply(lambda x: team_score_map[(x['game_id'], x['away_team_id'])], axis=1) df_b['home_score'] = df_b.apply(lambda x: team_score_map[(x['game_id'], x['home_team_id'])], axis=1) # 4. 恢复game_id为索引 df_b = df_b.set_index('game_id') # 查看结果 print(df_b)
内容的提问来源于stack exchange,提问作者1011 1110
相关产品推荐
相关产品推荐

