Skip to content

Commit d837bd4

Browse files
committed
Merge pull request #6421 from jreback/reindex_limit
REGR: Bug in Series.reindex when specifying a method with some nan values was inconsistent (GH6418)
2 parents 91b2b00 + c9c84e7 commit d837bd4

File tree

5 files changed

+33
-24
lines changed

5 files changed

+33
-24
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ Bug Fixes
163163
- ``Float64Index`` with nans not comparing correctly
164164
- ``eval``/``query`` expressions with strings containing the ``@`` character
165165
will now work (:issue:`6366`).
166+
- Bug in ``Series.reindex`` when specifying a ``method`` with some nan values was inconsistent (noted on a resample) (:issue:`6418`)
166167

167168
pandas 0.13.1
168169
-------------

pandas/core/generic.py

+3-17
Original file line numberDiff line numberDiff line change
@@ -1589,23 +1589,9 @@ def _reindex_axes(self, axes, level, limit, method, fill_value, copy,
15891589

15901590
axis = self._get_axis_number(a)
15911591
ax = self._get_axis(a)
1592-
try:
1593-
new_index, indexer = ax.reindex(
1594-
labels, level=level, limit=limit, method=method,
1595-
takeable=takeable)
1596-
except (ValueError):
1597-
1598-
# catch trying to reindex a non-monotonic index with a
1599-
# specialized indexer e.g. pad, so fallback to the regular
1600-
# indexer this will show up on reindexing a not-naturally
1601-
# ordering series,
1602-
# e.g.
1603-
# Series(
1604-
# [1,2,3,4], index=['a','b','c','d']
1605-
# ).reindex(['c','b','g'], method='pad')
1606-
new_index, indexer = ax.reindex(
1607-
labels, level=level, limit=limit, method=None,
1608-
takeable=takeable)
1592+
new_index, indexer = ax.reindex(
1593+
labels, level=level, limit=limit, method=method,
1594+
takeable=takeable)
16091595

16101596
obj = obj._reindex_with_indexers(
16111597
{axis: [new_index, indexer]}, method=method,

pandas/core/internals.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None,
265265
new_ref_items, indexer = self.items.reindex(new_ref_items,
266266
limit=limit)
267267

268-
needs_fill = method is not None and limit is None
268+
needs_fill = method is not None
269269
if fill_value is None:
270270
fill_value = self.fill_value
271271

@@ -275,10 +275,13 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None,
275275

276276
else:
277277

278-
# single block reindex
278+
# single block reindex, filling is already happending
279279
if self.ndim == 1:
280280
new_values = com.take_1d(self.values, indexer,
281281
fill_value=fill_value)
282+
block = make_block(new_values, new_items, new_ref_items,
283+
ndim=self.ndim, fastpath=True)
284+
return block
282285
else:
283286

284287
masked_idx = indexer[indexer != -1]
@@ -3705,8 +3708,6 @@ def _reindex_indexer_items(self, new_items, indexer, fill_value):
37053708

37063709
def reindex_axis0_with_method(self, new_axis, indexer=None, method=None,
37073710
fill_value=None, limit=None, copy=True):
3708-
if method is None:
3709-
indexer = None
37103711
return self.reindex(new_axis, indexer=indexer, method=method,
37113712
fill_value=fill_value, limit=limit, copy=copy)
37123713

pandas/tests/test_series.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -4999,9 +4999,8 @@ def test_reindex_pad(self):
49994999
result = s.reindex(new_index).ffill(downcast='infer')
50005000
assert_series_equal(result, expected)
50015001

5002-
# this preserves dtype
5003-
result = s.reindex(new_index, method='ffill')
5004-
assert_series_equal(result, expected)
5002+
# invalid because we can't forward fill on this type of index
5003+
self.assertRaises(ValueError, lambda : s.reindex(new_index, method='ffill'))
50055004

50065005
# inferrence of new dtype
50075006
s = Series([True,False,False,True],index=list('abcd'))

pandas/tseries/tests/test_resample.py

+22
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,28 @@ def test_resample_unequal_times(self):
650650
# it works!
651651
df.resample('AS', 'sum')
652652

653+
def test_resample_consistency(self):
654+
655+
# GH 6418
656+
# resample with bfill / limit / reindex consistency
657+
658+
i30 = index=pd.date_range('2002-02-02', periods=4, freq='30T')
659+
s=pd.Series(np.arange(4.), index=i30)
660+
s[2] = np.NaN
661+
662+
# Upsample by factor 3 with reindex() and resample() methods:
663+
i10 = pd.date_range(i30[0], i30[-1], freq='10T')
664+
665+
s10 = s.reindex(index=i10, method='bfill')
666+
s10_2 = s.reindex(index=i10, method='bfill', limit=2)
667+
rl = s.reindex_like(s10, method='bfill', limit=2)
668+
r10_2 = s.resample('10Min', fill_method='bfill', limit=2)
669+
r10 = s.resample('10Min', fill_method='bfill')
670+
671+
# s10_2, r10, r10_2, rl should all be equal
672+
assert_series_equal(s10_2, r10)
673+
assert_series_equal(s10_2, r10_2)
674+
assert_series_equal(s10_2, rl)
653675

654676
def _simple_ts(start, end, freq='D'):
655677
rng = date_range(start, end, freq=freq)

0 commit comments

Comments
 (0)