2

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

4

2 回答 2

1

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

首先你可以做映射

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)
于 2017-03-30T10:11:59.780 回答
1

您可以使用by和创建Seriesby并stack获取所有unique值:boolean indexingboolean maskmapisnull

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.']
于 2017-03-30T10:23:47.867 回答