From 7ee1c6902bda70e2349cf84bf80f9a1e48bb1cec Mon Sep 17 00:00:00 2001 From: Brock Date: Tue, 17 Nov 2020 20:00:03 -0800 Subject: [PATCH 1/2] BUG: loc.setitem corner case --- pandas/core/indexing.py | 9 ++++++++- pandas/tests/indexing/multiindex/test_setitem.py | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 62b1554246e26..4bfefc24add29 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1646,7 +1646,8 @@ def _setitem_with_indexer_split_path(self, indexer, value): value = self._align_series(indexer, value) # Ensure we have something we can iterate over - ilocs = self._ensure_iterable_column_indexer(indexer[1]) + info_axis = indexer[1] + ilocs = self._ensure_iterable_column_indexer(info_axis) pi = indexer[0] lplane_indexer = length_of_indexer(pi, self.obj.index) @@ -1670,6 +1671,12 @@ def _setitem_with_indexer_split_path(self, indexer, value): # We are trying to set N values into M entries of a single # column, which is invalid for N != M # Exclude zero-len for e.g. boolean masking that is all-false + + if len(value) == 1 and not is_integer(info_axis): + # This is a case like df.iloc[:3, [1]] = [0] + # where we treat as df.iloc[:3, 1] = 0 + return self._setitem_with_indexer((pi, info_axis[0]), value[0]) + raise ValueError( "Must have equal len keys and value " "when setting with an iterable" diff --git a/pandas/tests/indexing/multiindex/test_setitem.py b/pandas/tests/indexing/multiindex/test_setitem.py index f95eac57e9140..3607a4f211b6d 100644 --- a/pandas/tests/indexing/multiindex/test_setitem.py +++ b/pandas/tests/indexing/multiindex/test_setitem.py @@ -210,6 +210,11 @@ def test_multiindex_assignment(self): with pytest.raises(ValueError, match=msg): df.loc[4, "c"] = [0] + # But with a length-1 listlike column indexer this works + df.loc[4, ["c"]] = [0] + assert (df.loc[4, "c"] == 0).all() + + def test_groupby_example(self): # groupby example NUM_ROWS = 100 NUM_COLS = 10 From 40ec165e677440189b002311ed1e6cb6f6654b4c Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 25 Nov 2020 17:07:26 -0800 Subject: [PATCH 2/2] flesh out comment --- pandas/tests/indexing/multiindex/test_setitem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/tests/indexing/multiindex/test_setitem.py b/pandas/tests/indexing/multiindex/test_setitem.py index 3607a4f211b6d..e5d114d5a9b18 100644 --- a/pandas/tests/indexing/multiindex/test_setitem.py +++ b/pandas/tests/indexing/multiindex/test_setitem.py @@ -210,7 +210,8 @@ def test_multiindex_assignment(self): with pytest.raises(ValueError, match=msg): df.loc[4, "c"] = [0] - # But with a length-1 listlike column indexer this works + # But with a length-1 listlike column indexer this behaves like + # `df.loc[4, "c"] = 0 df.loc[4, ["c"]] = [0] assert (df.loc[4, "c"] == 0).all()