Используйте дубликат , чтобы найти первое вхождение, а затем map :
df['Num'] = df.Name[df.Name.duplicated(keep='last')].map(testDict)
print(df)
Выход
Name Num
0 A 1.0
1 A NaN
2 B 2.0
3 B NaN
Чтобы удалить значения NaN
, если хотите, выполните:
df = df.fillna('')