From b1a6bfb71159759be626469a1e3005bf8a7590ba Mon Sep 17 00:00:00 2001 From: phofl Date: Fri, 20 Nov 2020 00:33:04 +0100 Subject: [PATCH 1/2] BUG: Bug in setitem raising ValueError when setting more than one column via array --- pandas/core/indexing.py | 2 ++ pandas/tests/frame/indexing/test_setitem.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 9bfbc22b1e628..d693f171129f4 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -667,6 +667,8 @@ def _ensure_listlike_indexer(self, key, axis=None, value=None): if k not in self.obj: if value is None: self.obj[k] = np.nan + elif is_array_like(value) and value.ndim == 2: + self.obj[k] = value[:, i] elif is_list_like(value): self.obj[k] = value[i] else: diff --git a/pandas/tests/frame/indexing/test_setitem.py b/pandas/tests/frame/indexing/test_setitem.py index e4c57dc2b72fc..cd3102836422f 100644 --- a/pandas/tests/frame/indexing/test_setitem.py +++ b/pandas/tests/frame/indexing/test_setitem.py @@ -289,6 +289,21 @@ def test_setitem_periodindex(self): assert isinstance(rs.index, PeriodIndex) tm.assert_index_equal(rs.index, rng) + def test_setitem_complete_column_with_array(self): + # GH#37954 + df = DataFrame({"a": ["one", "two", "three"], "b": [1, 2, 3]}) + arr = np.array([[1, 1], [3, 1], [5, 1]]) + df[["c", "d"]] = arr + expected = DataFrame( + { + "a": ["one", "two", "three"], + "b": [1, 2, 3], + "c": [1, 3, 5], + "d": [1, 1, 1], + } + ) + tm.assert_frame_equal(df, expected) + class TestDataFrameSetItemSlicing: def test_setitem_slice_position(self): From 38daf8d6a50e026fd2cf93d90969298d9660405e Mon Sep 17 00:00:00 2001 From: phofl Date: Sat, 21 Nov 2020 02:54:43 +0100 Subject: [PATCH 2/2] Add comment --- pandas/core/indexing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index d693f171129f4..26aa5e3a71302 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -668,6 +668,7 @@ def _ensure_listlike_indexer(self, key, axis=None, value=None): if value is None: self.obj[k] = np.nan elif is_array_like(value) and value.ndim == 2: + # GH#37964 have to select columnwise in case of array self.obj[k] = value[:, i] elif is_list_like(value): self.obj[k] = value[i]