Python 创建具有多个数据帧和多个条件的列

Python 创建具有多个数据帧和多个条件的列,python,pandas,merge,Python,Pandas,Merge,我正在查看足球数据,并试图添加一个对手列,但在数据帧的组织方式上遇到了困难 ****编辑**** defense = {'week': [1, 1, 1, 1, 2, 2, 2, 2], 'team': ['GB', 'MIA', 'CHI', 'DET', 'GB', 'MIA', 'CHI', 'DET']} games = {'week': [1, 1, 2, 2], 'winner': ['GB', 'MIA', 'GB', 'DET'], 'loser': ['CHI',

我正在查看足球数据,并试图添加一个对手列,但在数据帧的组织方式上遇到了困难

****编辑****

defense = {'week': [1, 1, 1, 1, 2, 2, 2, 2], 'team': ['GB', 'MIA', 'CHI',       'DET', 'GB', 'MIA', 'CHI', 'DET']}
games = {'week': [1, 1, 2, 2], 'winner': ['GB', 'MIA', 'GB', 'DET'], 'loser': ['CHI', 'DET', 'MIA', 'CHI']}
def_df = pd.DataFrame(data=defense)
games_df = pd.DataFrame(data=games)
def_df

  team  week
0   GB     1
1  MIA     1
2  CHI     1
3  DET     1
4   GB     2
5  MIA     2
6  CHI     2
7  DET     2
游戏

  loser  week winner
0   CHI     1     GB
1   DET     1    MIA
2   MIA     2     GB
3   CHI     2    DET
我希望在那周的基础上增加一个防御[对手]专栏

  team  week    Opponent 
0   GB     1    CHI
1  MIA     1    DET
2  CHI     1    GB
3  DET     1    MIA
4   GB     2    MIA
5  MIA     2    GB
6  CHI     2    DET
7  DET     2    CHI

谢谢

更新 创建一列对手
下面是使用嵌套字典映射的一种方法:

from collections import defaultdict

d = defaultdict(dict)
for row in games_df.itertuples(index=False):
    d[row.week].update({row.winner: row.loser, row.loser: row.winner})

def_df['opponent'] = def_df.apply(lambda x: d[x['week']][x['team']], axis=1)

print(def_df)

  team  week opponent
0   GB     1      CHI
1  MIA     1      DET
2  CHI     1       GB
3  DET     1      MIA
4   GB     2      MIA
5  MIA     2       GB
6  CHI     2      DET
7  DET     2      CHI
使用元组键的一种同样有效的替代方法,可避免
集合

d = {}
for row in games_df.itertuples(index=False):
    d[(row.week, row.winner)] = row.loser
    d[(row.week, row.loser)] = row.winner

def_df['opponent'] = def_df.set_index(['week', 'team']).index.map(d.get)

尝试运行并获取'Key Error:0'@Parfait,实际上,我的意思是
defaultdict(dict)
,这样我就可以使用
dict.update
,而不必在一周内第一次遇到字典初始化。我还添加了一个没有
集合的版本。defaultdict有效!我需要做一些研究来了解原因,但是谢谢你的解决方案!
d = {}
for row in games_df.itertuples(index=False):
    d[(row.week, row.winner)] = row.loser
    d[(row.week, row.loser)] = row.winner

def_df['opponent'] = def_df.set_index(['week', 'team']).index.map(d.get)