合并在列内迭代的两个数据框

时间:2019-05-14 13:32:37

标签: python pandas dataframe merge

我有两个数据框,一个是球员,他们的俱乐部编号和回合,另一个是比赛,得分和回合。

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 个答案:

答案 0 :(得分:2)

要获得所需的最终帧,您可以重新排列数据。

首先,假设您的帧分别称为player_frameround_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