Skip to content

Commit c89b19f

Browse files
authored
Bug in iloc.setitem orienting IntegerArray into the wrong direction (pandas-dev#41288)
1 parent d6cb249 commit c89b19f

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

pandas/core/indexers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def check_setitem_lengths(indexer, value, values) -> bool:
164164
# a) not necessarily 1-D indexers, e.g. tuple
165165
# b) boolean indexers e.g. BoolArray
166166
if is_list_like(value):
167-
if len(indexer) != len(value):
167+
if len(indexer) != len(value) and values.ndim == 1:
168168
# boolean with truth values == len of the value is ok too
169169
if not (
170170
isinstance(indexer, np.ndarray)

pandas/core/internals/blocks.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -970,12 +970,7 @@ def setitem(self, indexer, value):
970970
values[indexer] = value
971971

972972
elif is_ea_value:
973-
# GH#38952
974-
if values.ndim == 1:
975-
values[indexer] = value
976-
else:
977-
# TODO(EA2D): special case not needed with 2D EA
978-
values[indexer] = value.to_numpy(values.dtype).reshape(-1, 1)
973+
values[indexer] = value
979974

980975
else:
981976
# error: Argument 1 to "setitem_datetimelike_compat" has incompatible type

pandas/tests/frame/indexing/test_setitem.py

+14-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
PeriodDtype,
1919
)
2020

21+
import pandas as pd
2122
from pandas import (
2223
Categorical,
2324
DataFrame,
@@ -792,22 +793,29 @@ def test_setitem_slice_position(self):
792793
tm.assert_frame_equal(df, expected)
793794

794795
@pytest.mark.parametrize("indexer", [tm.setitem, tm.iloc])
795-
@pytest.mark.parametrize("box", [Series, np.array, list])
796+
@pytest.mark.parametrize("box", [Series, np.array, list, pd.array])
796797
@pytest.mark.parametrize("n", [1, 2, 3])
797-
def test_setitem_broadcasting_rhs(self, n, box, indexer):
798+
def test_setitem_slice_indexer_broadcasting_rhs(self, n, box, indexer):
798799
# GH#40440
799-
# TODO: Add pandas array as box after GH#40933 is fixed
800800
df = DataFrame([[1, 3, 5]] + [[2, 4, 6]] * n, columns=["a", "b", "c"])
801801
indexer(df)[1:] = box([10, 11, 12])
802802
expected = DataFrame([[1, 3, 5]] + [[10, 11, 12]] * n, columns=["a", "b", "c"])
803803
tm.assert_frame_equal(df, expected)
804804

805+
@pytest.mark.parametrize("box", [Series, np.array, list, pd.array])
806+
@pytest.mark.parametrize("n", [1, 2, 3])
807+
def test_setitem_list_indexer_broadcasting_rhs(self, n, box):
808+
# GH#40440
809+
df = DataFrame([[1, 3, 5]] + [[2, 4, 6]] * n, columns=["a", "b", "c"])
810+
df.iloc[list(range(1, n + 1))] = box([10, 11, 12])
811+
expected = DataFrame([[1, 3, 5]] + [[10, 11, 12]] * n, columns=["a", "b", "c"])
812+
tm.assert_frame_equal(df, expected)
813+
805814
@pytest.mark.parametrize("indexer", [tm.setitem, tm.iloc])
806-
@pytest.mark.parametrize("box", [Series, np.array, list])
815+
@pytest.mark.parametrize("box", [Series, np.array, list, pd.array])
807816
@pytest.mark.parametrize("n", [1, 2, 3])
808-
def test_setitem_broadcasting_rhs_mixed_dtypes(self, n, box, indexer):
817+
def test_setitem_slice_broadcasting_rhs_mixed_dtypes(self, n, box, indexer):
809818
# GH#40440
810-
# TODO: Add pandas array as box after GH#40933 is fixed
811819
df = DataFrame(
812820
[[1, 3, 5], ["x", "y", "z"]] + [[2, 4, 6]] * n, columns=["a", "b", "c"]
813821
)

pandas/tests/indexing/test_iloc.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ def test_iloc_setitem_ea_inplace(self, frame_or_series, box, using_array_manager
122122
else:
123123
values = obj[0].values
124124

125-
obj.iloc[:2] = box(arr[2:])
125+
if frame_or_series is Series:
126+
obj.iloc[:2] = box(arr[2:])
127+
else:
128+
obj.iloc[:2, 0] = box(arr[2:])
129+
126130
expected = frame_or_series(np.array([3, 4, 3, 4], dtype="i8"))
127131
tm.assert_equal(obj, expected)
128132

0 commit comments

Comments
 (0)