diff --git a/doc/source/v0.13.0.txt b/doc/source/v0.13.0.txt index 611da0e536759..afc5a70393c70 100644 --- a/doc/source/v0.13.0.txt +++ b/doc/source/v0.13.0.txt @@ -490,7 +490,7 @@ Enhancements mask dfi[mask.any(1)] - :ref:`See the docs` for more. + :ref:`See the docs` for more. - ``Series`` now supports a ``to_frame`` method to convert it to a single-column DataFrame (:issue:`5164`) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 3409fdf00b370..335f772bbc04c 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -1241,8 +1241,19 @@ def _reindex_axes(self, axes, level, limit, method, fill_value, copy, takeable=F labels = _ensure_index(labels) axis = self._get_axis_number(a) - new_index, indexer = self._get_axis(a).reindex( - labels, level=level, limit=limit, takeable=takeable) + ax = self._get_axis(a) + try: + new_index, indexer = ax.reindex(labels, level=level, + limit=limit, method=method, takeable=takeable) + except (ValueError): + + # catch trying to reindex a non-monotonic index with a specialized indexer + # e.g. pad, so fallback to the regular indexer + # this will show up on reindexing a not-naturally ordering series, e.g. + # Series([1,2,3,4],index=['a','b','c','d']).reindex(['c','b','g'],method='pad') + new_index, indexer = ax.reindex(labels, level=level, + limit=limit, method=None, takeable=takeable) + obj = obj._reindex_with_indexers( {axis: [new_index, indexer]}, method=method, fill_value=fill_value, limit=limit, copy=copy) diff --git a/pandas/core/internals.py b/pandas/core/internals.py index df62edf2f7833..697f99fcca81f 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -224,6 +224,7 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, fill_valu if indexer is None: new_ref_items, indexer = self.items.reindex(new_ref_items, limit=limit) + needs_fill = method is not None and limit is None if fill_value is None: fill_value = self.fill_value @@ -245,14 +246,13 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, fill_valu new_items = self.items.take(masked_idx) # fill if needed - fill_method = method is not None or limit is not None - if fill_method: + if needs_fill: new_values = com.interpolate_2d(new_values, method=method, limit=limit, fill_value=fill_value) block = make_block(new_values, new_items, new_ref_items, ndim=self.ndim, fastpath=True) # down cast if needed - if not self.is_float and (fill_method or notnull(fill_value)): + if not self.is_float and (needs_fill or notnull(fill_value)): block = block.downcast() return block