我有两个数据框,一个是球员,他们的俱乐部编号和回合,另一个是比赛,得分和回合。
Player| club_id | round a | 16 | 1 b | 13 | 1 c | 12 | 1 a | 16 | 2 ...
home_club_id| away_club_id |home_club_score| away_club_score| round 16 | 13 | 1 |2 |1 15 | 1 | 4 |0 |1 12 | 2 | 1 |1 |1 12 | 16 | 2 |2 |2 ...
我想合并两个数据框,以查看玩家是否在家打球,以及比赛的得分。
最终的数据帧可能是这样的:
Player|club_id|round|home|score|opponent_score a |16 |1 | yes|1 | 2 b |13 |1 | no |2 | 1 a |16 |2 | no |2 | 2 ...
我试图将home_club_id
更改为club_id
并与on =[round, club_id]
合并,但是我没有找到同时合并住所和外地的方法
答案 0 :(得分:2)
要获得所需的最终帧,您可以重新排列数据。
首先,假设您的帧分别称为player_frame
和round_frame
:
from io import StringIO
import pandas as pd
player_data = StringIO('''Player club_id round
a 16 1
b 13 1
c 12 1
a 16 2''')
player_frame = pd.read_csv(player_data, sep='\s+')
round_data = StringIO('''home_club_id away_club_id home_club_score away_club_score round
16 13 1 2 1
15 1 4 0 1
12 2 1 1 1
12 16 2 2 2''')
round_frame = pd.read_csv(round_data, sep='\s+')
然后我们可以拉出列以分别引用本垒打和离开的数据,重命名它们以使其匹配,并标记该行是否为本垒打。
home_values = round_frame[['home_club_id', 'home_club_score', 'away_club_score', 'round']]\
.rename({'home_club_id': 'club_id',
'home_club_score': 'score',
'away_club_score': 'opponent_score'},
axis=1)\
.assign(home='yes')
away_values = round_frame[['away_club_id', 'away_club_score', 'home_club_score', 'round']]\
.rename({'away_club_id': 'club_id',
'home_club_score': 'opponent_score',
'away_club_score': 'score'},
axis=1)\
.assign(home='no')
然后我们可以concat
将两者合并成player_frame
:
final_values = pd.concat([home_values, away_values], ignore_index=True).merge(player_frame)
哪个给了我们
club_id score opponent_score round home Player
0 16 1 2 1 yes a
1 12 1 1 1 yes c
2 13 2 1 1 no b
3 16 2 2 2 no a