有条件地合并熊猫数据框

时间:2019-07-30 08:22:34

标签: python pandas

一本又一本地阅读后,我的头很痛,我无法理解如何解决这个问题。

我有2个包含体育比赛的pandas数据框(此处简化):

A: Date, HomeTeam, AwayTeam
B: Date, HomeTeam, AwayTeam, HomeScore, AwayScore

AB必须合并为A

AB包含更多匹配项,因此A大于B,必须保留A的大小(请考虑{{1 }}我们的“主人”。

A必须为Date,HomeTeam和AwayTeam匹配的每一行填写HomeScore和AwayScore。

我如何正确合并这两个?

我已经考虑过使用B或熊猫条件iterrows(),但我看不出如何解决它。

2 个答案:

答案 0 :(得分:2)

您可以使用pd.DataFrame.join

idxs = ['Date', 'HomeTeam', 'AwayTeam']
joined = A.set_index(idxs).join(B.set_index(idxs), how='left').reset_index()

这将产生一个数据帧,其中的行与A中的行数相同,但具有额外的列,这些数据帧将从B中获取值,或者如果{{ 1}}没有出现在这里。您正在使用SQL术语执行左联接。

答案 1 :(得分:2)

您可以使用merge()how = 'left'选项来指定要进行左连接以保持A的行。

这是它的样子:

A = pd.DataFrame({'Date' : ['2019-06-12', '2019-08-06', '2019-08-06'],
                  'HomeTeam' : ['Team A', 'Team B', 'Team C'],
                  'AwayTeam' : ['Team D', 'Team E', 'Team F']})
B = pd.DataFrame({'Date' : ['2019-06-12', '2019-08-06'],
                  'HomeTeam' : ['Team A', 'Team B'],
                  'AwayTeam' : ['Team D', 'Team E'],
                  'HomeScore' : [54, 64], 'AwayScore' : [12, 16]})

A.merge(B, on = ['Date', 'HomeTeam', 'AwayTeam'], how = 'left')

输出:

         Date HomeTeam AwayTeam  HomeScore  AwayScore
0  2019-06-12   Team A   Team D       54.0       12.0
1  2019-08-06   Team B   Team E       64.0       16.0
2  2019-08-06   Team C   Team F        NaN        NaN