Чтобы получить желаемый конечный кадр, вы можете вместо этого переставить данные.
Для начала предположим, что ваши кадры называются 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