Skip to content

Commit 0703722

Browse files
committed
Unify _ensure_listlike_indexer
1 parent 8ccd2b8 commit 0703722

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
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, is_indexer_key=False)
2828+
self.loc._ensure_listlike_indexer(key)
28292829
indexer = self.loc._get_listlike_indexer(
28302830
key, axis=1, raise_missing=False
28312831
)[1]

pandas/core/indexing.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ def _slice(self, obj, axis: int, kind=None):
160160
return self.obj._slice(obj, axis=axis, kind=kind)
161161

162162
def _get_setitem_indexer(self, key):
163+
if self.name == "loc":
164+
self._ensure_listlike_indexer(key)
165+
163166
if self.axis is not None:
164167
return self._convert_tuple(key)
165168

@@ -1728,7 +1731,7 @@ def _getitem_axis(self, key, axis: int):
17281731
self._validate_key(key, axis)
17291732
return self._get_label(key, axis=axis)
17301733

1731-
def _ensure_listlike_indexer(self, key, is_indexer_key: bool):
1734+
def _ensure_listlike_indexer(self, key):
17321735
"""
17331736
Ensure that a list-like of column labels are all present by adding them if
17341737
they do not already exist.
@@ -1737,36 +1740,38 @@ def _ensure_listlike_indexer(self, key, is_indexer_key: bool):
17371740
----------
17381741
key : _LocIndexer key or list-like of column labels
17391742
Target labels.
1740-
is_indexer_key : bool
1741-
Whether key is a _LocIndexer key
17421743
"""
17431744
column_axis = 1
1744-
if is_indexer_key:
1745+
1746+
# check if self.obj is at least 2-dimensional
1747+
if len(self.obj.shape) <= column_axis:
1748+
return
1749+
1750+
if isinstance(key, tuple):
1751+
# key is a _LocIndexer key
1752+
17451753
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
1754+
# key indexes multiple columns
1755+
is_list_like_indexer(key[column_axis])
17511756
and not com.is_bool_indexer(key[column_axis])
17521757
):
17531758
return
1759+
1760+
# set key to the column part of key which is a list-like of column
1761+
# labels
17541762
key = key[column_axis]
17551763

1756-
if not isinstance(self.obj._get_axis(column_axis), ABCMultiIndex) and all(
1757-
is_hashable(k) for k in key
1764+
if (
1765+
not isinstance(self.obj._get_axis(column_axis), ABCMultiIndex)
1766+
and is_list_like(key)
1767+
and all(is_hashable(k) for k in key)
17581768
):
17591769
for k in key:
17601770
try:
17611771
self.obj[k]
17621772
except KeyError:
17631773
self.obj[k] = np.nan
17641774

1765-
def _get_setitem_indexer(self, key):
1766-
self._ensure_listlike_indexer(key, is_indexer_key=True)
1767-
return super()._get_setitem_indexer(key)
1768-
1769-
17701775
class _iLocIndexer(_LocationIndexer):
17711776
"""
17721777
Purely integer-location based indexing for selection by position.

0 commit comments

Comments
 (0)