Skip to content

Commit 712e871

Browse files
committed
Fix indexing.setitem when type is pd.Categorical
1 parent 1f4fcb5 commit 712e871

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

pandas/core/internals/blocks.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,14 @@ def setitem(self, indexer, value):
883883
):
884884
values[indexer] = value
885885
try:
886+
# GH25495 may need to convert to categorical block
887+
if self.is_categorical_astype(
888+
arr_value.dtype
889+
) and not is_categorical_dtype(values):
890+
return self.make_block(
891+
Categorical(self.values, dtype=arr_value.dtype)
892+
)
893+
886894
values = values.astype(arr_value.dtype)
887895
except ValueError:
888896
pass

pandas/tests/frame/test_indexing.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,15 @@ def test_setitem_list_of_tuples(self, float_frame):
204204
expected = Series(tuples, index=float_frame.index, name="tuples")
205205
tm.assert_series_equal(result, expected)
206206

207+
def test_setitem_single_row_categorical(self):
208+
df = DataFrame({"Alpha": ["a"], "Numeric": [0]})
209+
categories = pd.Categorical(df["Alpha"], categories=["a", "b", "c"])
210+
df.loc[:, "Alpha"] = categories
211+
212+
result = df["Alpha"]
213+
expected = Series(categories, index=df.index, name="Alpha")
214+
tm.assert_series_equal(result, expected)
215+
207216
def test_setitem_mulit_index(self):
208217
# GH7655, test that assigning to a sub-frame of a frame
209218
# with multi-index columns aligns both rows and columns

0 commit comments

Comments
 (0)