reindex of empty CategoricalIndex sometimes fails if target is not a CategoricalIndex · Issue #28690 · pandas-dev/pandas (original) (raw)

c:\python36\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    195         @wraps(func)
    196         def wrapper(*args, **kwargs):
--> 197             return func(*args, **kwargs)
    198 
    199         if not PY2:

c:\python36\lib\site-packages\pandas\core\frame.py in reindex(self, *args, **kwargs)
   3807         kwargs.pop('axis', None)
   3808         kwargs.pop('labels', None)
-> 3809         return super(DataFrame, self).reindex(**kwargs)
   3810 
   3811     @Appender(_shared_docs['reindex_axis'] % _shared_doc_kwargs)

c:\python36\lib\site-packages\pandas\core\generic.py in reindex(self, *args, **kwargs)
   4354         # perform the reindex on the axes
   4355         return self._reindex_axes(axes, level, limit, tolerance, method,
-> 4356                                   fill_value, copy).__finalize__(self)
   4357 
   4358     def _reindex_axes(self, axes, level, limit, tolerance, method, fill_value,

c:\python36\lib\site-packages\pandas\core\frame.py in _reindex_axes(self, axes, level, limit, tolerance, method, fill_value, copy)
   3734         if columns is not None:
   3735             frame = frame._reindex_columns(columns, method, copy, level,
-> 3736                                            fill_value, limit, tolerance)
   3737 
   3738         index = axes['index']

c:\python36\lib\site-packages\pandas\core\frame.py in _reindex_columns(self, new_columns, method, copy, level, fill_value, limit, tolerance)
   3756         new_columns, indexer = self.columns.reindex(new_columns, method=method,
   3757                                                     level=level, limit=limit,
-> 3758                                                     tolerance=tolerance)
   3759         return self._reindex_with_indexers({1: [new_columns, indexer]},
   3760                                            copy=copy, fill_value=fill_value,

c:\python36\lib\site-packages\pandas\core\indexes\category.py in reindex(self, target, method, level, limit, tolerance)
    521             else:
    522 
--> 523                 codes = new_target.codes.copy()
    524                 codes[indexer == -1] = cats[missing]
    525                 new_target = self._create_from_codes(codes)

This should not fail, but rather return an 0x1 DataFrame with the new columns. Other, closely-related, expressions do work correctly in this scenario e.g.:

pd.DataFrame(columns=pd.CategoricalIndex([], categories=['A'])).reindex(columns=pd.Index(['B']))
pd.DataFrame(columns=pd.CategoricalIndex([], categories=['A'])).reindex(columns=pd.CategoricalIndex(['A']))
pd.DataFrame(columns=pd.CategoricalIndex([], categories=['A'])).reindex(columns=pd.CategoricalIndex(['B']))
pd.DataFrame(columns=pd.Index(['A']))