Convert human-readable yes/no strings in varied case to Python booleans. By hand, normalise each string to lowercase and look it up in a mapping dict. With pandas, .str.lower() lowercases the column in one pass, then .map(dict) remaps each element to its boolean value.

By hand

With pandas

.str.lower() lowercases the entire string column, then .map(dict) replaces each value with the corresponding boolean. The dtype of the resulting Series is bool because every input maps to a value.

naive.py
mapping = {'yes': True, 'y': True, 'no': False, 'n': False}
labels = ['yes', 'no', 'Y', 'N', 'yes']
result = []
for s in labels:
    result.append(mapping[s.lower()])
print('RESULT:', result)
library.py
import pandas as pd
from dalib.display import set_display
set_display()

labels = ['yes', 'no', 'Y', 'N', 'yes']
df = pd.DataFrame({'x': labels})
s = df['x'].str.lower().map({'yes': True, 'y': True, 'no': False, 'n': False})
result = s.tolist()
print('index:', s.index.tolist())
print('dtype:', s.dtype)
print('values:', s.tolist())
print('RESULT:', result)
index: [0, 1, 2, 3, 4]
dtype: bool
values: [True, False, True, False, True]
RESULT: [True, False, True, False, True]

Implementation notes

  • When all inputs are in the mapping, the result Series has dtype bool. If any string is unmapped, .map returns NaN for that position and the dtype becomes object — use errors='raise' or validate inputs upstream to catch surprises.
  • The normalization dict can be extended for common variants: 'true', 'false', '1', '0', 'on', 'off'.
  • Cross-reference: coerce-bad-numbers (this chapter) for the analogous pattern of mapping strings to numerics where some values may be invalid.