Skip to content

Commit 785fbd4

Browse files
jbrockmendelJulianWgs
authored andcommitted
CLN: indexing (pandas-dev#37142)
1 parent b9ffe96 commit 785fbd4

File tree

4 files changed

+22
-18
lines changed

4 files changed

+22
-18
lines changed

pandas/core/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3091,7 +3091,7 @@ def _setitem_array(self, key, value):
30913091
for k1, k2 in zip(key, value.columns):
30923092
self[k1] = value[k2]
30933093
else:
3094-
self.loc._ensure_listlike_indexer(key, axis=1)
3094+
self.loc._ensure_listlike_indexer(key, axis=1, value=value)
30953095
indexer = self.loc._get_listlike_indexer(
30963096
key, axis=1, raise_missing=False
30973097
)[1]

pandas/core/indexing.py

+15-13
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ def _get_setitem_indexer(self, key):
633633
raise
634634
raise IndexingError(key) from e
635635

636-
def _ensure_listlike_indexer(self, key, axis=None):
636+
def _ensure_listlike_indexer(self, key, axis=None, value=None):
637637
"""
638638
Ensure that a list-like of column labels are all present by adding them if
639639
they do not already exist.
@@ -663,9 +663,14 @@ def _ensure_listlike_indexer(self, key, axis=None):
663663
and not com.is_bool_indexer(key)
664664
and all(is_hashable(k) for k in key)
665665
):
666-
for k in key:
666+
for i, k in enumerate(key):
667667
if k not in self.obj:
668-
self.obj[k] = np.nan
668+
if value is None:
669+
self.obj[k] = np.nan
670+
elif is_list_like(value):
671+
self.obj[k] = value[i]
672+
else:
673+
self.obj[k] = value
669674

670675
def __setitem__(self, key, value):
671676
if isinstance(key, tuple):
@@ -1540,9 +1545,10 @@ def _setitem_with_indexer(self, indexer, value):
15401545
# if there is only one block/type, still have to take split path
15411546
# unless the block is one-dimensional or it can hold the value
15421547
if not take_split_path and self.obj._mgr.blocks:
1543-
(blk,) = self.obj._mgr.blocks
1544-
if 1 < blk.ndim: # in case of dict, keys are indices
1548+
if self.ndim > 1:
1549+
# in case of dict, keys are indices
15451550
val = list(value.values()) if isinstance(value, dict) else value
1551+
blk = self.obj._mgr.blocks[0]
15461552
take_split_path = not blk._can_hold_element(val)
15471553

15481554
# if we have any multi-indexes that have non-trivial slices
@@ -1576,10 +1582,7 @@ def _setitem_with_indexer(self, indexer, value):
15761582
# must have all defined axes if we have a scalar
15771583
# or a list-like on the non-info axes if we have a
15781584
# list-like
1579-
len_non_info_axes = (
1580-
len(_ax) for _i, _ax in enumerate(self.obj.axes) if _i != i
1581-
)
1582-
if any(not l for l in len_non_info_axes):
1585+
if not len(self.obj):
15831586
if not is_list_like_indexer(value):
15841587
raise ValueError(
15851588
"cannot set a frame with no "
@@ -1764,7 +1767,7 @@ def _setitem_with_indexer(self, indexer, value):
17641767
self._setitem_single_column(loc, value, pi)
17651768

17661769
else:
1767-
self._setitem_single_block_inplace(indexer, value)
1770+
self._setitem_single_block(indexer, value)
17681771

17691772
def _setitem_single_column(self, loc: int, value, plane_indexer):
17701773
# positional setting on column loc
@@ -1791,10 +1794,9 @@ def _setitem_single_column(self, loc: int, value, plane_indexer):
17911794
# reset the sliced object if unique
17921795
self.obj._iset_item(loc, ser)
17931796

1794-
def _setitem_single_block_inplace(self, indexer, value):
1797+
def _setitem_single_block(self, indexer, value):
17951798
"""
1796-
_setitem_with_indexer for the case when we have a single Block
1797-
and the value can be set into it without casting.
1799+
_setitem_with_indexer for the case when we have a single Block.
17981800
"""
17991801
from pandas import Series
18001802

pandas/core/internals/blocks.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ def dtype(self):
340340
def iget(self, i):
341341
return self.values[i]
342342

343-
def set(self, locs, values):
343+
def set_inplace(self, locs, values):
344344
"""
345345
Modify block values in-place with new item value.
346346
@@ -1676,7 +1676,9 @@ def iget(self, col):
16761676
raise IndexError(f"{self} only contains one item")
16771677
return self.values
16781678

1679-
def set(self, locs, values):
1679+
def set_inplace(self, locs, values):
1680+
# NB: This is a misnomer, is supposed to be inplace but is not,
1681+
# see GH#33457
16801682
assert locs.tolist() == [0]
16811683
self.values = values
16821684

@@ -2231,7 +2233,7 @@ def _can_hold_element(self, element: Any) -> bool:
22312233

22322234
return is_valid_nat_for_dtype(element, self.dtype)
22332235

2234-
def set(self, locs, values):
2236+
def set_inplace(self, locs, values):
22352237
"""
22362238
See Block.set.__doc__
22372239
"""

pandas/core/internals/managers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1083,7 +1083,7 @@ def value_getitem(placement):
10831083
blk = self.blocks[blkno]
10841084
blk_locs = blklocs[val_locs.indexer]
10851085
if blk.should_store(value):
1086-
blk.set(blk_locs, value_getitem(val_locs))
1086+
blk.set_inplace(blk_locs, value_getitem(val_locs))
10871087
else:
10881088
unfit_mgr_locs.append(blk.mgr_locs.as_array[blk_locs])
10891089
unfit_val_locs.append(val_locs)

0 commit comments

Comments
 (0)