Python 如何记录引发KeyError的值

Python 如何记录引发KeyError的值,python,pandas,apply,pandas-apply,Python,Pandas,Apply,Pandas Apply,给定此数据帧,df: Player 1 Player 2 0 Thiem D. Almagro N. 1 Almagro N. Ferrer D. 2 Nadal R. Thiem D. 和映射d: d = { 'Thiem D.': 'Dominic Thiem', 'Nadal R.': 'Rafael Nadal', 'Ferrer D.': 'David Ferrer', } 我想重命名播放器名称,同时我想跟踪映射中不

给定此数据帧,
df

     Player 1    Player 2
0    Thiem D.  Almagro N.
1  Almagro N.   Ferrer D.
2    Nadal R.    Thiem D.
和映射
d

d = {
    'Thiem D.': 'Dominic Thiem',
    'Nadal R.': 'Rafael Nadal',
    'Ferrer D.': 'David Ferrer',
}
我想重命名播放器名称,同时我想跟踪映射中不存在的元素(保存到文件,或只是打印)

我可以用这条线完成的任务的第一部分:

player_columns = ['Player 1', 'Player 2']
df[player_columns] = df[player_columns].applymap(lambda x: d.get(x, x))
其结果是:

        Player 1       Player 2
0  Dominic Thiem     Almagro N.
1     Almagro N.   David Ferrer
2   Rafael Nadal  Dominic Thiem
Almagro N.
在映射中不存在条目,因此无法重命名它。我想抓住这个名字


我知道我可以将
UserDict
对象子类化并在那里实现此行为,但我很好奇是否有其他方法可以实现此操作?

您可以尝试将操作拆分为多个操作

首先,您可以进行映射

df.applymap(d.get)

        Player 1       Player 2
0  Dominic Thiem           None
1           None   David Ferrer
2   Rafael Nadal  Dominic Thiem
这将为您提供无法映射为
None

现在您可以检查
None
s

df[df.applymap(d.get).isnull()]

     Player 1    Player 2
0         NaN  Almagro N.
1  Almagro N.         NaN
2         NaN         NaN
如果您想将它们作为一个不被映射的名称列表,您可以简单地执行以下操作

unmappables = df[df.applymap(d.get).isnull()]
player1s = unmappables['Player 1'].values.tolist()
player2s = unmappables['Player 2'].values.tolist()
pd.Series((player1s + player2s)).dropna().unique()
给予


您可以创建
系列
by,并使用
布尔掩码
by和获取所有值:

array(['Almagro N.'], dtype=object)
df1 = df[player_columns].stack()
print (df1)
0  Player 1      Thiem D.
   Player 2    Almagro N.
1  Player 1    Almagro N.
   Player 2     Ferrer D.
2  Player 1      Nadal R.
   Player 2      Thiem D.
dtype: object

print (df1[df1.map(d).isnull()].unique())
['Almagro N.']