如何记录引发KeyError

时间:2017-03-30 09:41:39

标签: python pandas apply pandas-apply

鉴于此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对象并在那里实现这个行为,但我很好奇是否有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

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

首先,您可以进行映射

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)

答案 1 :(得分:1)

您可以按stack创建Series,并unique获取所有boolean indexingmap isnull cookies problem in PHP and AJAX

boolean mask