@@ -633,7 +633,7 @@ def _get_setitem_indexer(self, key):
633
633
raise
634
634
raise IndexingError (key ) from e
635
635
636
- def _ensure_listlike_indexer (self , key , axis = None ):
636
+ def _ensure_listlike_indexer (self , key , axis = None , value = None ):
637
637
"""
638
638
Ensure that a list-like of column labels are all present by adding them if
639
639
they do not already exist.
@@ -663,9 +663,14 @@ def _ensure_listlike_indexer(self, key, axis=None):
663
663
and not com .is_bool_indexer (key )
664
664
and all (is_hashable (k ) for k in key )
665
665
):
666
- for k in key :
666
+ for i , k in enumerate ( key ) :
667
667
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
669
674
670
675
def __setitem__ (self , key , value ):
671
676
if isinstance (key , tuple ):
@@ -1540,9 +1545,10 @@ def _setitem_with_indexer(self, indexer, value):
1540
1545
# if there is only one block/type, still have to take split path
1541
1546
# unless the block is one-dimensional or it can hold the value
1542
1547
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
1545
1550
val = list (value .values ()) if isinstance (value , dict ) else value
1551
+ blk = self .obj ._mgr .blocks [0 ]
1546
1552
take_split_path = not blk ._can_hold_element (val )
1547
1553
1548
1554
# if we have any multi-indexes that have non-trivial slices
@@ -1576,10 +1582,7 @@ def _setitem_with_indexer(self, indexer, value):
1576
1582
# must have all defined axes if we have a scalar
1577
1583
# or a list-like on the non-info axes if we have a
1578
1584
# 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 ):
1583
1586
if not is_list_like_indexer (value ):
1584
1587
raise ValueError (
1585
1588
"cannot set a frame with no "
@@ -1764,7 +1767,7 @@ def _setitem_with_indexer(self, indexer, value):
1764
1767
self ._setitem_single_column (loc , value , pi )
1765
1768
1766
1769
else :
1767
- self ._setitem_single_block_inplace (indexer , value )
1770
+ self ._setitem_single_block (indexer , value )
1768
1771
1769
1772
def _setitem_single_column (self , loc : int , value , plane_indexer ):
1770
1773
# positional setting on column loc
@@ -1791,10 +1794,9 @@ def _setitem_single_column(self, loc: int, value, plane_indexer):
1791
1794
# reset the sliced object if unique
1792
1795
self .obj ._iset_item (loc , ser )
1793
1796
1794
- def _setitem_single_block_inplace (self , indexer , value ):
1797
+ def _setitem_single_block (self , indexer , value ):
1795
1798
"""
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.
1798
1800
"""
1799
1801
from pandas import Series
1800
1802
0 commit comments