@@ -1516,15 +1516,28 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, fill_valu
15161516 if indexer is None :
15171517 indexer = np .arange (len (self .items ))
15181518
1519- new_values = com .take_1d (self .values .values , indexer )
1519+ # single block
1520+ if self .ndim == 1 :
1521+
1522+ new_items = new_ref_items
1523+ new_values = com .take_1d (self .values .values , indexer )
1524+
1525+ else :
1526+
1527+ # if we don't overlap at all, then don't include this block
1528+ new_items = self .items & new_ref_items
1529+ if not len (new_items ):
1530+ return None
1531+
1532+ new_values = self .values .values
15201533
15211534 # fill if needed
15221535 if method is not None or limit is not None :
15231536 if fill_value is None :
15241537 fill_value = self .fill_value
15251538 new_values = com .interpolate_2d (new_values , method = method , limit = limit , fill_value = fill_value )
15261539
1527- return self .make_block (new_values , items = new_ref_items , ref_items = new_ref_items , copy = copy )
1540+ return self .make_block (new_values , items = new_items , ref_items = new_ref_items , copy = copy )
15281541
15291542 def sparse_reindex (self , new_index ):
15301543 """ sparse reindex and return a new block
@@ -2794,15 +2807,34 @@ def reindex_items(self, new_items, indexer=None, copy=True, fill_value=None):
27942807 if indexer is None :
27952808 for blk in self .blocks :
27962809 if copy :
2797- new_blocks . append ( blk .reindex_items_from (new_items ) )
2810+ blk = blk .reindex_items_from (new_items )
27982811 else :
27992812 blk .ref_items = new_items
2813+ if blk is not None :
28002814 new_blocks .append (blk )
28012815 else :
2802- for block in self .blocks :
2803- newb = block .reindex_items_from (new_items , copy = copy )
2804- if len (newb .items ) > 0 :
2805- new_blocks .append (newb )
2816+
2817+ # unique
2818+ if self .axes [0 ].is_unique :
2819+ for block in self .blocks :
2820+
2821+ newb = block .reindex_items_from (new_items , copy = copy )
2822+ if newb is not None and len (newb .items ) > 0 :
2823+ new_blocks .append (newb )
2824+
2825+ # non-unique
2826+ else :
2827+ rl = self ._set_ref_locs ()
2828+ for i , idx in enumerate (indexer ):
2829+ blk , lidx = rl [idx ]
2830+ item = new_items .take ([i ])
2831+ blk = make_block (_block_shape (blk .iget (lidx )),
2832+ item ,
2833+ new_items ,
2834+ ndim = self .ndim ,
2835+ fastpath = True ,
2836+ placement = [i ])
2837+ new_blocks .append (blk )
28062838
28072839 # add a na block if we are missing items
28082840 mask = indexer == - 1
0 commit comments