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

如何将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

实现步骤与代码

思路

提供两种实现逻辑,可根据数据实际情况选择:

  1. 基础版:假设DataFrame A中同一赛事的得分顺序与DF B的客场、主场顺序完全对应,直接按赛事分组匹配。
  2. 严谨版:通过球队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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:15:38