diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 0bcaa83c49628..e15d8a7b0e323 100755 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -654,7 +654,6 @@ def can_do_equal_len(): for i, idx in enumerate(indexer) if i != info_axis ) - and item_labels.is_unique ): self.obj[item_labels[indexer[info_axis]]] = value return diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index c5254aaa4af5f..128016718dfed 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -1075,6 +1075,12 @@ def value_getitem(placement): blknos = self._blknos[loc] blklocs = self._blklocs[loc].copy() + if not self.axes[0].is_unique: + if not isinstance(blknos, np.ndarray): + blknos = [blknos] + if not isinstance(blklocs, np.ndarray): + blklocs = [blklocs] + unfit_mgr_locs = [] unfit_val_locs = [] removed_blknos = [] diff --git a/pandas/tests/indexing/test_iloc.py b/pandas/tests/indexing/test_iloc.py index 760d8c70b9434..429bb33466f15 100644 --- a/pandas/tests/indexing/test_iloc.py +++ b/pandas/tests/indexing/test_iloc.py @@ -462,6 +462,17 @@ def test_iloc_setitem_dups(self): df.iloc[[1, 0], [0, 1]] = df.iloc[[1, 0], [0, 1]].reset_index(drop=True) tm.assert_frame_equal(df, expected) + def test_iloc_change_dtype_dups(self): + # GH 22035 and GH 24798 + + df = DataFrame([['0', 1, '2']], columns=['A', 'B', 'B']) + df.iloc[:, 0] = df.iloc[:, 0].astype(int) + assert df.dtypes.tolist() == ['int', 'int', 'O'] + + df = DataFrame([['0', '1', '2']], columns=['A', 'B', 'B']) + df.iloc[:, 0] = df.iloc[:, 0].astype(int) + assert df.dtypes.tolist() == ['int', 'O', 'O'] + def test_iloc_getitem_frame(self): df = DataFrame( np.random.randn(10, 4), index=range(0, 20, 2), columns=range(0, 8, 2)