Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions feature_engine/imputation/categorical.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,9 +243,13 @@ def transform(self, X: pd.DataFrame) -> pd.DataFrame:
X = self._transform(X)

# if variable is of type category, we need to add the new
# category, before filling in the nan
# category, before filling in the nan, unless it is already
# one of the categories
for variable in self.variables_:
if X[variable].dtype.name == "category":
if (
X[variable].dtype.name == "category"
and self.imputer_dict_[variable] not in X[variable].cat.categories
):
X[variable] = X[variable].cat.add_categories(
self.imputer_dict_[variable]
)
Expand Down
27 changes: 27 additions & 0 deletions tests/test_imputation/test_categorical_imputer.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,33 @@ def test_variables_cast_as_category_frequent(df_na):
pd.testing.assert_frame_equal(X_transformed, X_reference)


@pytest.mark.parametrize("ordered", [False, True])
def test_variables_cast_as_category_with_fill_value_already_a_category(ordered):
categories = ["unknown", "west", "east"]
X = pd.DataFrame(
{
"region": pd.Categorical(
["east", None, "west"], categories=categories, ordered=ordered
)
}
)

imputer = CategoricalImputer(fill_value="unknown", variables=["region"])
X_transformed = imputer.fit_transform(X)

X_reference = pd.DataFrame(
{
"region": pd.Categorical(
["east", "unknown", "west"], categories=categories, ordered=ordered
)
}
)
pd.testing.assert_frame_equal(X_transformed, X_reference)

# transforming the imputed data again leaves it unchanged
pd.testing.assert_frame_equal(imputer.transform(X_transformed), X_reference)


@pytest.mark.parametrize(
"ignore_format",
[22.3, 1, "HOLA", {"key1": "value1", "key2": "value2", "key3": "value3"}],
Expand Down