diff --git a/doc/source/release.rst b/doc/source/release.rst index af8c4bdf381e7..e40f9c2826f99 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -163,6 +163,7 @@ Bug Fixes - ``Float64Index`` with nans not comparing correctly - ``eval``/``query`` expressions with strings containing the ``@`` character will now work (:issue:`6366`). +- Bug in ``Series.reindex`` when specifying a ``method`` with some nan values was inconsistent (noted on a resample) (:issue:`6418`) pandas 0.13.1 ------------- diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 3251e59e53603..01bf5baf21161 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -1589,23 +1589,9 @@ def _reindex_axes(self, axes, level, limit, method, fill_value, copy, axis = self._get_axis_number(a) 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) + new_index, indexer = ax.reindex( + labels, level=level, limit=limit, method=method, + takeable=takeable) obj = obj._reindex_with_indexers( {axis: [new_index, indexer]}, method=method, diff --git a/pandas/core/internals.py b/pandas/core/internals.py index 761fd6b4af61c..5d96c8c3b64d1 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -265,7 +265,7 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, new_ref_items, indexer = self.items.reindex(new_ref_items, limit=limit) - needs_fill = method is not None and limit is None + needs_fill = method is not None if fill_value is None: fill_value = self.fill_value @@ -275,10 +275,13 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, else: - # single block reindex + # single block reindex, filling is already happending if self.ndim == 1: new_values = com.take_1d(self.values, indexer, fill_value=fill_value) + block = make_block(new_values, new_items, new_ref_items, + ndim=self.ndim, fastpath=True) + return block else: masked_idx = indexer[indexer != -1] @@ -3705,8 +3708,6 @@ def _reindex_indexer_items(self, new_items, indexer, fill_value): def reindex_axis0_with_method(self, new_axis, indexer=None, method=None, fill_value=None, limit=None, copy=True): - if method is None: - indexer = None return self.reindex(new_axis, indexer=indexer, method=method, fill_value=fill_value, limit=limit, copy=copy) diff --git a/pandas/tests/test_series.py b/pandas/tests/test_series.py index fde998c1ba230..4821c5b4d030f 100644 --- a/pandas/tests/test_series.py +++ b/pandas/tests/test_series.py @@ -4999,9 +4999,8 @@ def test_reindex_pad(self): result = s.reindex(new_index).ffill(downcast='infer') assert_series_equal(result, expected) - # this preserves dtype - result = s.reindex(new_index, method='ffill') - assert_series_equal(result, expected) + # invalid because we can't forward fill on this type of index + self.assertRaises(ValueError, lambda : s.reindex(new_index, method='ffill')) # inferrence of new dtype s = Series([True,False,False,True],index=list('abcd')) diff --git a/pandas/tseries/tests/test_resample.py b/pandas/tseries/tests/test_resample.py index 7e9433ac41ddd..2d4d8ccfa1a98 100644 --- a/pandas/tseries/tests/test_resample.py +++ b/pandas/tseries/tests/test_resample.py @@ -650,6 +650,28 @@ def test_resample_unequal_times(self): # it works! df.resample('AS', 'sum') + def test_resample_consistency(self): + + # GH 6418 + # resample with bfill / limit / reindex consistency + + i30 = index=pd.date_range('2002-02-02', periods=4, freq='30T') + s=pd.Series(np.arange(4.), index=i30) + s[2] = np.NaN + + # Upsample by factor 3 with reindex() and resample() methods: + i10 = pd.date_range(i30[0], i30[-1], freq='10T') + + s10 = s.reindex(index=i10, method='bfill') + s10_2 = s.reindex(index=i10, method='bfill', limit=2) + rl = s.reindex_like(s10, method='bfill', limit=2) + r10_2 = s.resample('10Min', fill_method='bfill', limit=2) + r10 = s.resample('10Min', fill_method='bfill') + + # s10_2, r10, r10_2, rl should all be equal + assert_series_equal(s10_2, r10) + assert_series_equal(s10_2, r10_2) + assert_series_equal(s10_2, rl) def _simple_ts(start, end, freq='D'): rng = date_range(start, end, freq=freq)