Skip to content

Commit c738317

Browse files
committed
BUG: Bug in fillna with Series and a passed series/dict (GH5703)
1 parent 97cf3fd commit c738317

File tree

4 files changed

+54
-9
lines changed

4 files changed

+54
-9
lines changed

doc/source/release.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,7 @@ Bug Fixes
822822
- Bug in groupby returning non-consistent types when user function returns a ``None``, (:issue:`5592`)
823823
- Work around regression in numpy 1.7.0 which erroneously raises IndexError from ``ndarray.item`` (:issue:`5666`)
824824
- Bug in repeated indexing of object with resultant non-unique index (:issue:`5678`)
825+
- Bug in fillna with Series and a passed series/dict (:issue:`5703`)
825826

826827
pandas 0.12.0
827828
-------------

pandas/core/generic.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1905,7 +1905,16 @@ def fillna(self, value=None, method=None, axis=0, inplace=False,
19051905

19061906
if len(self._get_axis(axis)) == 0:
19071907
return self
1908-
if isinstance(value, (dict, com.ABCSeries)):
1908+
1909+
if self.ndim == 1 and value is not None:
1910+
if isinstance(value, (dict, com.ABCSeries)):
1911+
from pandas import Series
1912+
value = Series(value)
1913+
1914+
new_data = self._data.fillna(value, inplace=inplace,
1915+
downcast=downcast)
1916+
1917+
elif isinstance(value, (dict, com.ABCSeries)):
19091918
if axis == 1:
19101919
raise NotImplementedError('Currently only can fill '
19111920
'with dict/Series column '

pandas/core/internals.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ def putmask(self, mask, new, align=True, inplace=False):
664664

665665
# if we are passed a scalar None, convert it here
666666
if not is_list_like(new) and isnull(new):
667-
new = np.nan
667+
new = self.fill_value
668668

669669
if self._can_hold_element(new):
670670
new = self._try_cast(new)
@@ -830,7 +830,7 @@ def _interpolate(self, method=None, index=None, values=None,
830830
data = data.astype(np.float64)
831831

832832
if fill_value is None:
833-
fill_value = np.nan
833+
fill_value = self.fill_value
834834

835835
if method in ('krogh', 'piecewise_polynomial', 'pchip'):
836836
if not index.is_monotonic:
@@ -1196,6 +1196,10 @@ class TimeDeltaBlock(IntBlock):
11961196
_can_hold_na = True
11971197
is_numeric = False
11981198

1199+
@property
1200+
def fill_value(self):
1201+
return tslib.iNaT
1202+
11991203
def _try_fill(self, value):
12001204
""" if we are a NaT, return the actual fill value """
12011205
if isinstance(value, type(tslib.NaT)) or isnull(value):
@@ -1532,6 +1536,10 @@ def _try_coerce_result(self, result):
15321536
result = lib.Timestamp(result)
15331537
return result
15341538

1539+
@property
1540+
def fill_value(self):
1541+
return tslib.iNaT
1542+
15351543
def _try_fill(self, value):
15361544
""" if we are a NaT, return the actual fill value """
15371545
if isinstance(value, type(tslib.NaT)) or isnull(value):
@@ -3183,25 +3191,29 @@ def reindex_items(self, new_items, indexer=None, copy=True,
31833191
new_axes = [new_items] + self.axes[1:]
31843192

31853193
# could have so me pathological (MultiIndex) issues here
3194+
def _valid_blocks(newb):
3195+
if newb is None:
3196+
return []
3197+
if not isinstance(newb, list):
3198+
newb = [ newb ]
3199+
return [ b for b in newb if len(b.items) > 0 ]
3200+
31863201
new_blocks = []
31873202
if indexer is None:
31883203
for blk in self.blocks:
31893204
if copy:
31903205
blk = blk.reindex_items_from(new_items)
31913206
else:
31923207
blk.ref_items = new_items
3193-
if blk is not None:
3194-
new_blocks.append(blk)
3208+
new_blocks.extend(_valid_blocks(blk))
31953209
else:
31963210

31973211
# unique
31983212
if self.axes[0].is_unique and new_items.is_unique:
31993213

32003214
for block in self.blocks:
3201-
3202-
newb = block.reindex_items_from(new_items, copy=copy)
3203-
if newb is not None and len(newb.items) > 0:
3204-
new_blocks.append(newb)
3215+
blk = block.reindex_items_from(new_items, copy=copy)
3216+
new_blocks.extend(_valid_blocks(blk))
32053217

32063218
# non-unique
32073219
else:

pandas/tests/test_series.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2760,6 +2760,29 @@ def test_fillna(self):
27602760
self.assertRaises(ValueError, ts.fillna)
27612761
self.assertRaises(ValueError, self.ts.fillna, value=0, method='ffill')
27622762

2763+
# GH 5703
2764+
s1 = Series([np.nan])
2765+
s2 = Series([1])
2766+
result = s1.fillna(s2)
2767+
expected = Series([1.])
2768+
assert_series_equal(result,expected)
2769+
result = s1.fillna({})
2770+
assert_series_equal(result,s1)
2771+
result = s1.fillna(Series(()))
2772+
assert_series_equal(result,s1)
2773+
result = s2.fillna(s1)
2774+
assert_series_equal(result,s2)
2775+
result = s1.fillna({ 0 : 1})
2776+
assert_series_equal(result,expected)
2777+
result = s1.fillna({ 1 : 1})
2778+
assert_series_equal(result,Series([np.nan]))
2779+
result = s1.fillna({ 0 : 1, 1 : 1})
2780+
assert_series_equal(result,expected)
2781+
result = s1.fillna(Series({ 0 : 1, 1 : 1}))
2782+
assert_series_equal(result,expected)
2783+
result = s1.fillna(Series({ 0 : 1, 1 : 1},index=[4,5]))
2784+
assert_series_equal(result,s1)
2785+
27632786
def test_fillna_bug(self):
27642787
x = Series([nan, 1., nan, 3., nan], ['z', 'a', 'b', 'c', 'd'])
27652788
filled = x.fillna(method='ffill')

0 commit comments

Comments
 (0)