Объединить два кадра данных, повторяющихся в столбцах - PullRequest
2 голосов
/ 14 мая 2019

У меня есть два фрейма данных, один из игроков с идентификаторами и раундами их клубов, а другой с матчами, с результатами и раундами.

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], но я не нашел способа слиться с домом и в одно и то же время

1 Ответ

2 голосов
/ 14 мая 2019

Чтобы получить желаемый конечный кадр, вы можете вместо этого переставить данные.

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