@@ -1690,18 +1690,42 @@ def _setitem_with_indexer(self, indexer, value):
1690
1690
sub_indexer = list (indexer )
1691
1691
multiindex_indexer = isinstance (labels , ABCMultiIndex )
1692
1692
# TODO: we are implicitly assuming value.columns is unique
1693
+ unique_cols = value .columns .is_unique
1694
+
1695
+ if not unique_cols and value .columns .equals (self .obj .columns ):
1696
+ # We assume we are already aligned, see
1697
+ # test_iloc_setitem_frame_duplicate_columns_multiple_blocks
1698
+ for loc in ilocs :
1699
+ item = item_labels [loc ]
1700
+ if item in value :
1701
+ sub_indexer [info_axis ] = item
1702
+ v = self ._align_series (
1703
+ tuple (sub_indexer ),
1704
+ value .iloc [:, loc ],
1705
+ multiindex_indexer ,
1706
+ )
1707
+ else :
1708
+ v = np .nan
1693
1709
1694
- for loc in ilocs :
1695
- item = item_labels [loc ]
1696
- if item in value :
1697
- sub_indexer [info_axis ] = item
1698
- v = self ._align_series (
1699
- tuple (sub_indexer ), value [item ], multiindex_indexer
1700
- )
1701
- else :
1702
- v = np .nan
1710
+ self ._setitem_single_column (loc , v , pi )
1703
1711
1704
- self ._setitem_single_column (loc , v , pi )
1712
+ elif not unique_cols :
1713
+ raise ValueError (
1714
+ "Setting with non-unique columns is not allowed."
1715
+ )
1716
+
1717
+ else :
1718
+ for loc in ilocs :
1719
+ item = item_labels [loc ]
1720
+ if item in value :
1721
+ sub_indexer [info_axis ] = item
1722
+ v = self ._align_series (
1723
+ tuple (sub_indexer ), value [item ], multiindex_indexer
1724
+ )
1725
+ else :
1726
+ v = np .nan
1727
+
1728
+ self ._setitem_single_column (loc , v , pi )
1705
1729
1706
1730
# we have an equal len ndarray/convertible to our labels
1707
1731
# hasattr first, to avoid coercing to ndarray without reason.
0 commit comments