如何记录引发 KeyError 的值

How to log values which raised KeyError

给定这个 DataFrame,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

的玩家

现在您可以检查 Nones

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()

给予

array(['Almagro N.'], dtype=object)

您可以通过 stack and get all unique values by boolean indexing with boolean mask by map and isnull 创建 Series:

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.']