Two methods recode values in a column:
replace swaps the values you list and leaves everything else alone: df["region"].replace({"North": "N", "South": "S"}).
map looks every value up in a dictionary (or passes it to a function): df["region"].map(managers). A value missing from the dictionary becomes NaN, which is the classic surprise. Add .fillna(...) to give those rows a default.
Use replace to fix a few known bad values; use map to translate a code into something else (a manager's name, a True/False flag) where every value should be covered.
replace also works on numbers: col.replace(0, np.nan) turns a placeholder zero into a real missing value.