Skip to content

Commit a454456

Browse files
committed
Put all checks in _ensure_listlike_indexer
1 parent 17dac59 commit a454456

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

pandas/core/frame.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2825,7 +2825,7 @@ def _setitem_array(self, key, value):
28252825
for k1, k2 in zip(key, value.columns):
28262826
self[k1] = value[k2]
28272827
else:
2828-
self.loc._ensure_listlike_indexer(key, axis=1)
2828+
self.loc._ensure_listlike_indexer(key, is_indexer_key=False)
28292829
indexer = self.loc._get_listlike_indexer(
28302830
key, axis=1, raise_missing=False
28312831
)[1]

pandas/core/indexing.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1728,19 +1728,32 @@ def _getitem_axis(self, key, axis: int):
17281728
self._validate_key(key, axis)
17291729
return self._get_label(key, axis=axis)
17301730

1731-
def _ensure_listlike_indexer(self, key: Iterable, axis: int):
1731+
def _ensure_listlike_indexer(self, key, is_indexer_key: bool):
17321732
"""
1733-
Ensure that a list-like of keys are all present by adding them if they
1734-
do not already exist.
1733+
Ensure that a list-like of column labels are all present by adding them if
1734+
they do not already exist.
17351735
17361736
Parameters
17371737
----------
1738-
key : list-like
1739-
Target labels
1740-
axis : int
1741-
Dimension on which the indexing is being made
1738+
key : _LocIndexer key or list-like of column labels
1739+
Target labels.
1740+
is_indexer_key : bool
1741+
Whether key is a _LocIndexer key
17421742
"""
1743-
if not isinstance(self.obj._get_axis(axis), ABCMultiIndex) and all(
1743+
column_axis = 1
1744+
if is_indexer_key:
1745+
if not (
1746+
isinstance(key, tuple)
1747+
and len(key) >= 2 # key is at least 2-dimensional
1748+
and is_list_like_indexer(
1749+
key[column_axis]
1750+
) # key indexes multiple columns
1751+
and not com.is_bool_indexer(key[column_axis])
1752+
):
1753+
return
1754+
key = key[column_axis]
1755+
1756+
if not isinstance(self.obj._get_axis(column_axis), ABCMultiIndex) and all(
17441757
is_hashable(k) for k in key
17451758
):
17461759
for k in key:
@@ -1750,13 +1763,7 @@ def _ensure_listlike_indexer(self, key: Iterable, axis: int):
17501763
self.obj[k] = np.nan
17511764

17521765
def _get_setitem_indexer(self, key):
1753-
if (
1754-
isinstance(key, tuple)
1755-
and len(key) >= 2 # key is at least 2-dimensional
1756-
and is_list_like_indexer(key[1]) # key indexes multiple columns
1757-
and not com.is_bool_indexer(key[1])
1758-
):
1759-
self._ensure_listlike_indexer(key[1], axis=1)
1766+
self._ensure_listlike_indexer(key, is_indexer_key=True)
17601767
return super()._get_setitem_indexer(key)
17611768

17621769

0 commit comments

Comments
 (0)