一本又一本地阅读后,我的头很痛,我无法理解如何解决这个问题。
我有2个包含体育比赛的pandas数据框(此处简化):
A: Date, HomeTeam, AwayTeam
B: Date, HomeTeam, AwayTeam, HomeScore, AwayScore
A
和B
必须合并为A
。
A
比B
包含更多匹配项,因此A
大于B
,必须保留A
的大小(请考虑{{1 }}我们的“主人”。
A
必须为Date,HomeTeam和AwayTeam匹配的每一行填写HomeScore和AwayScore。
我如何正确合并这两个?
我已经考虑过使用B
或熊猫条件iterrows()
,但我看不出如何解决它。
答案 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