如何记录引发 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
的玩家
现在您可以检查 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()
给予
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.']
给定这个 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
现在您可以检查 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()
给予
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.']