Want to know the diff among pd.factorize, pd.get_dummies, sklearn.preprocessing.LableEncoder and OneHotEncoder
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
Categorical encoding converts text labels into numbers that machine learning models can process. Python offers four main tools for this: pd.factorize (simple integer encoding), pd.get_dummies (one-hot encoding in pandas), LabelEncoder (integer encoding in scikit-learn), and OneHotEncoder (one-hot encoding in scikit-learn). Each has different strengths regarding handling unknown categories, integration with ML pipelines, and output format.
pd.factorize
Assigns a unique integer to each unique value. Returns codes and unique values:
Key characteristics:
- Assigns integers in order of first appearance (not alphabetical)
- Returns
(codes_array, unique_values_array) - Does not remember the mapping — cannot transform new data
- Handles
NaNas-1by default
LabelEncoder (sklearn)
Similar to factorize but remembers the mapping and can transform new data:
Key characteristics:
- Assigns integers in alphabetical order (sorted)
- Remembers the mapping via
fit()— cantransform()new data - Raises an error for unseen categories during
transform() - Designed for encoding target variables (y), not features (X)
pd.get_dummies
Creates binary columns (one-hot encoding) directly in pandas:
Key characteristics:
- Returns a DataFrame with new binary columns
- Does not remember the mapping — cannot transform new data consistently
drop_first=Trueavoids the dummy variable trap for linear models- Handles
NaNby skipping it (no column created) unlessdummy_na=True
OneHotEncoder (sklearn)
Scikit-learn's pipeline-compatible one-hot encoder:
Key characteristics:
- Remembers the mapping via
fit()— works in sklearn pipelines handle_unknown="ignore"produces all-zero rows for unseen categories- Returns a sparse matrix by default (
sparse_output=True) - Expects 2D input (column vector), not 1D
drop="first"avoids multicollinearity
Comparison Table
| Feature | pd.factorize | LabelEncoder | pd.get_dummies | OneHotEncoder |
| Output | Integer codes | Integer codes | Binary columns | Binary matrix |
| Remembers mapping | No | Yes (fit/transform) | No | Yes (fit/transform) |
| Unknown categories | N/A | Error | New column or missing | ignore/error/infrequent |
| Pipeline compatible | No | Limited | No | Yes (ColumnTransformer) |
| Input shape | 1D Series | 1D array | DataFrame | 2D array |
| Best for | Quick exploration | Target encoding | Quick EDA | ML pipelines |
When to Use Each
Common Pitfalls
- Using LabelEncoder on features: LabelEncoder assigns ordinal integers (0, 1, 2) which imply an ordering. Tree-based models handle this fine, but linear models and neural networks interpret "red=2" as twice "blue=1". Use OneHotEncoder for nominal features in these models.
- pd.get_dummies creating inconsistent columns: If the training set has
["red", "blue"]and the test set has["red", "green"],get_dummiescreates different columns for each. UseOneHotEncoder.fit()on training data to ensure consistent columns. - LabelEncoder crashing on unknown categories:
le.transform(["yellow"])raisesValueErrorif "yellow" was not in the training data. OneHotEncoder withhandle_unknown="ignore"handles this gracefully by outputting all zeros. - Forgetting
drop_firstfor linear models: Including all one-hot columns creates perfect multicollinearity (the columns sum to 1). This causes issues for linear regression and logistic regression. Usedrop_first=Trueordrop="first". - OneHotEncoder expecting 2D input:
ohe.fit_transform(["red", "blue"])fails because OneHotEncoder expects a 2D array. Reshape withnp.array(data).reshape(-1, 1)or pass a DataFrame column asdf[["color"]].
Summary
pd.factorize: Quick integer encoding, no memory of mapping, order-of-appearance labelsLabelEncoder: Integer encoding with fit/transform, alphabetical order, best for target variablespd.get_dummies: Quick one-hot encoding in pandas, no fit/transform, good for explorationOneHotEncoder: Pipeline-compatible one-hot encoding, handles unknown categories, production-ready- Use
OneHotEncoderin sklearn pipelines for consistent encoding between train and test sets - Use
drop_first=Trueordrop="first"for linear models to avoid multicollinearity

