@@ -1654,8 +1654,8 @@ def _setitem_with_indexer_split_path(self, indexer, value):
1654
1654
# Ensure we have something we can iterate over
1655
1655
ilocs = self ._ensure_iterable_column_indexer (indexer [1 ])
1656
1656
1657
- plane_indexer = indexer [: 1 ]
1658
- lplane_indexer = length_of_indexer (plane_indexer [ 0 ] , self .obj .index )
1657
+ pi = indexer [0 ]
1658
+ lplane_indexer = length_of_indexer (pi , self .obj .index )
1659
1659
# lplane_indexer gives the expected length of obj[indexer[0]]
1660
1660
1661
1661
if len (ilocs ) == 1 :
@@ -1686,14 +1686,10 @@ def _setitem_with_indexer_split_path(self, indexer, value):
1686
1686
elif np .ndim (value ) == 2 :
1687
1687
self ._setitem_with_indexer_2d_value (indexer , value )
1688
1688
1689
- elif (
1690
- len (ilocs ) == 1
1691
- and lplane_indexer == len (value )
1692
- and not is_scalar (plane_indexer [0 ])
1693
- ):
1689
+ elif len (ilocs ) == 1 and lplane_indexer == len (value ) and not is_scalar (pi ):
1694
1690
# we have an equal len list/ndarray
1695
1691
# We only get here with len(ilocs) == 1
1696
- self ._setitem_single_column (ilocs [0 ], value , plane_indexer )
1692
+ self ._setitem_single_column (ilocs [0 ], value , pi )
1697
1693
1698
1694
elif lplane_indexer == 0 and len (value ) == len (self .obj .index ):
1699
1695
# We get here in one case via .loc with a all-False mask
@@ -1708,20 +1704,20 @@ def _setitem_with_indexer_split_path(self, indexer, value):
1708
1704
)
1709
1705
1710
1706
for loc , v in zip (ilocs , value ):
1711
- self ._setitem_single_column (loc , v , plane_indexer )
1707
+ self ._setitem_single_column (loc , v , pi )
1712
1708
else :
1713
1709
1714
1710
if isinstance (indexer [0 ], np .ndarray ) and indexer [0 ].ndim > 2 :
1715
1711
raise ValueError (r"Cannot set values with ndim > 2" )
1716
1712
1717
1713
# scalar value
1718
1714
for loc in ilocs :
1719
- self ._setitem_single_column (loc , value , plane_indexer )
1715
+ self ._setitem_single_column (loc , value , pi )
1720
1716
1721
1717
def _setitem_with_indexer_2d_value (self , indexer , value ):
1722
1718
# We get here with np.ndim(value) == 2, excluding DataFrame,
1723
1719
# which goes through _setitem_with_indexer_frame_value
1724
- plane_indexer = indexer [: 1 ]
1720
+ pi = indexer [0 ]
1725
1721
1726
1722
ilocs = self ._ensure_iterable_column_indexer (indexer [1 ])
1727
1723
@@ -1734,13 +1730,13 @@ def _setitem_with_indexer_2d_value(self, indexer, value):
1734
1730
1735
1731
for i , loc in enumerate (ilocs ):
1736
1732
# setting with a list, re-coerces
1737
- self ._setitem_single_column (loc , value [:, i ].tolist (), plane_indexer )
1733
+ self ._setitem_single_column (loc , value [:, i ].tolist (), pi )
1738
1734
1739
1735
def _setitem_with_indexer_frame_value (self , indexer , value : "DataFrame" ):
1740
1736
ilocs = self ._ensure_iterable_column_indexer (indexer [1 ])
1741
1737
1742
1738
sub_indexer = list (indexer )
1743
- plane_indexer = indexer [: 1 ]
1739
+ pi = indexer [0 ]
1744
1740
1745
1741
multiindex_indexer = isinstance (self .obj .columns , ABCMultiIndex )
1746
1742
@@ -1761,7 +1757,7 @@ def _setitem_with_indexer_frame_value(self, indexer, value: "DataFrame"):
1761
1757
else :
1762
1758
val = np .nan
1763
1759
1764
- self ._setitem_single_column (loc , val , plane_indexer )
1760
+ self ._setitem_single_column (loc , val , pi )
1765
1761
1766
1762
elif not unique_cols :
1767
1763
raise ValueError ("Setting with non-unique columns is not allowed." )
@@ -1777,10 +1773,18 @@ def _setitem_with_indexer_frame_value(self, indexer, value: "DataFrame"):
1777
1773
else :
1778
1774
val = np .nan
1779
1775
1780
- self ._setitem_single_column (loc , val , plane_indexer )
1776
+ self ._setitem_single_column (loc , val , pi )
1781
1777
1782
1778
def _setitem_single_column (self , loc : int , value , plane_indexer ):
1783
- # positional setting on column loc
1779
+ """
1780
+
1781
+ Parameters
1782
+ ----------
1783
+ loc : int
1784
+ Indexer for column position
1785
+ plane_indexer : int, slice, listlike[int]
1786
+ The indexer we use for setitem along axis=0.
1787
+ """
1784
1788
pi = plane_indexer
1785
1789
1786
1790
ser = self .obj ._ixs (loc , axis = 1 )
@@ -1790,15 +1794,12 @@ def _setitem_single_column(self, loc: int, value, plane_indexer):
1790
1794
# which means essentially reassign to the columns of a
1791
1795
# multi-dim object
1792
1796
# GH#6149 (null slice), GH#10408 (full bounds)
1793
- if isinstance (pi , tuple ) and all (
1794
- com .is_null_slice (idx ) or com .is_full_slice (idx , len (self .obj ))
1795
- for idx in pi
1796
- ):
1797
+ if com .is_null_slice (pi ) or com .is_full_slice (pi , len (self .obj )):
1797
1798
ser = value
1798
1799
else :
1799
1800
# set the item, possibly having a dtype change
1800
1801
ser = ser .copy ()
1801
- ser ._mgr = ser ._mgr .setitem (indexer = pi , value = value )
1802
+ ser ._mgr = ser ._mgr .setitem (indexer = ( pi ,) , value = value )
1802
1803
ser ._maybe_update_cacher (clear = True )
1803
1804
1804
1805
# reset the sliced object if unique
0 commit comments