Q:

Как заменить NaN в серии Pandas с помощью словаря?

Есть DataFrame:
    Customer    City
0   Customer 1  Moscow
1   Customer 1  Moscow
2   Customer 1  Moscow
3   Customer 1  NaN
4   Customer 2  New York
5   Customer 2  New York
6   Customer 2  New York
7   Customer 2  NaN
8   Customer 2  NaN
9   Customer 2  NaN
10  Customer 2  NaN
11  Customer 2  NaN
12  Customer 3  London
13  Customer 3  London
14  Customer 3  London
15  Customer 3  NaN
16  Customer 4  Paris
17  Customer 5  NaN
18  Customer 5  Deli

И есть словарь:
{'Customer 1': 'Moscow',
 'Customer 2': 'New York',
 'Customer 3': 'London',
 'Customer 4': 'Paris',
 'Customer 5': 'Deli'}

Подскажите, пожалуйста, как заменить 'NaN' в DataFrame на соответствующие значения в словаре по Customer? Я пробовал через метод loc получать доступ к пустым значениям и выполнять replacе по данному словарю, но такой алгоритм берет первое значение City из словаря и заменяет все 'NaN' на него.

A:

словарь замены:
mapping = {
 'Customer 1': 'Moscow',
 'Customer 2': 'New York',
 'Customer 3': 'London',
 'Customer 4': 'Paris',
 'Customer 5': 'Deli'}

маска замены (учитывает варианты когда NaN - это np.NaN или просто строка "NaN"):
mask = df['City'].astype('str').isin(['NaN','nan'])

замена:
df.loc[mask, 'City'] = df.loc[mask, 'Customer'].map(mapping)

результат:
In [160]: df
Out[160]:
      Customer      City
0   Customer 1    Moscow
1   Customer 1    Moscow
2   Customer 1    Moscow
3   Customer 1    Moscow
4   Customer 2  New York
5   Customer 2  New York
6   Customer 2  New York
7   Customer 2  New York
8   Customer 2  New York
9   Customer 2  New York
10  Customer 2  New York
11  Customer 2  New York
12  Customer 3    London
13  Customer 3    London
14  Customer 3    London
15  Customer 3    London
16  Customer 4     Paris
17  Customer 5      Deli
18  Customer 5      Deli

вот более идиоматический вариант заполнения отсутствующих значений в группе соседними значениями (не требует словаря замены):
df['City'] = df.groupby('Customer')['City'].apply(lambda x: x.ffill().bfill())

