Skip to content

Commit

Permalink
GH pandas-dev#14499 Panel.ffill ignores axis parameter and fill along…
Browse files Browse the repository at this point in the history
… axis=1
  • Loading branch information
Tux1 committed Nov 2, 2016
1 parent eb7bd99 commit 4fb4dc9
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 21 deletions.
4 changes: 3 additions & 1 deletion doc/source/whatsnew/v0.19.1.txt
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,6 @@ Bug Fixes


- Bug in ``pd.pivot_table`` may raise ``TypeError`` or ``ValueError`` when ``index`` or ``columns``
is not scalar and ``values`` is not specified (:issue:`14380`)
is not scalar and ``values`` is not specified (:issue:`14380`)

- Bug in ``pd.Panel.ffill`` where ``axis`` was not propagated (:issue:`14499`)
53 changes: 34 additions & 19 deletions pandas/core/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -3205,26 +3205,21 @@ def fillna(self, value=None, method=None, axis=None, inplace=False,
'you passed a "{0}"'.format(type(value).__name__))
self._consolidate_inplace()

# set the default here, so functions examining the signaure
# set the default here, so functions examining the signature
# can detect if something was set (e.g. in groupby) (GH9221)
if axis is None:
axis = 0
if self.ndim == 3:
axis = 1
else:
axis = 0

axis = self._get_axis_number(axis)
method = missing.clean_fill_method(method)

from pandas import DataFrame
if value is None:
if method is None:
raise ValueError('must specify a fill method or value')
if self._is_mixed_type and axis == 1:
if inplace:
raise NotImplementedError()
result = self.T.fillna(method=method, limit=limit).T

# need to downcast here because of all of the transposes
result._data = result._data.downcast()

return result

# > 3d
if self.ndim > 3:
Expand All @@ -3233,21 +3228,41 @@ def fillna(self, value=None, method=None, axis=None, inplace=False,

# 3d
elif self.ndim == 3:

# fill in 2d chunks
result = dict([(col, s.fillna(method=method, value=value))
for col, s in self.iteritems()])
if axis == 0:
frame = self.swapaxes(0, 1)
axis2d = 0
else:
frame = self
axis2d = axis - 1
result = dict([(col, s.fillna(method=method,
value=value,
axis=axis2d))
for col, s in frame.iteritems()])
new_obj = self._constructor.\
from_dict(result).__finalize__(self)
if axis == 0:
new_obj = new_obj.swapaxes(0, 1)
new_data = new_obj._data

else:
# 2d or less
method = missing.clean_fill_method(method)
new_data = self._data.interpolate(method=method, axis=axis,
limit=limit, inplace=inplace,
coerce=True,
downcast=downcast)
if self._is_mixed_type and axis == 1:
if inplace:
raise NotImplementedError()
result = self.T.fillna(method=method, limit=limit).T

# need to downcast here because of all of the transposes
result._data = result._data.downcast()

return result
else:
method = missing.clean_fill_method(method)
new_data = self._data.interpolate(method=method, axis=axis,
limit=limit,
inplace=inplace,
coerce=True,
downcast=downcast)
else:
if method is not None:
raise ValueError('cannot specify both a fill method and value')
Expand Down
46 changes: 45 additions & 1 deletion pandas/tests/test_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -1475,7 +1475,7 @@ def test_fillna(self):

panel = self.panel.copy()
panel['str'] = 'foo'

print(panel)
filled = panel.fillna(method='backfill')
assert_frame_equal(filled['ItemA'],
panel['ItemA'].fillna(method='backfill'))
Expand Down Expand Up @@ -1519,6 +1519,50 @@ def test_ffill_bfill(self):
assert_panel_equal(self.panel.bfill(),
self.panel.fillna(method='bfill'))

def test_ffill_bfill_axis(self):
# GH 14499
a = Panel({
'a': np.arange(15, dtype=float).reshape((5, 3)),
'b': np.arange(15, 30, dtype=float).reshape((5, 3))
})
f0 = a.copy()
f1 = a.copy()
f2 = a.copy()
b0 = a.copy()
b1 = a.copy()
b2 = a.copy()
a['a'].loc[1, 1] = np.nan
f0['a'].loc[1, 1] = np.nan
f1['a'].loc[1, 1] = 1
f2['a'].loc[1, 1] = 3
b0['a'].loc[1, 1] = 19.0
b1['a'].loc[1, 1] = 7
b2['a'].loc[1, 1] = 5

# method='ffill'
# axis=0
assert_panel_equal(a.ffill(axis=0), f0)

# method='ffill'
# axis=1
assert_panel_equal(a.ffill(axis=1), f1)

# method='ffill'
# axis=2
assert_panel_equal(a.ffill(axis=2), f2)

# method='bfill'
# axis=1
assert_panel_equal(a.bfill(axis=0), b0)

# method='bfill'
# axis=1
assert_panel_equal(a.bfill(axis=1), b1)

# method='bfill'
# axis=2
assert_panel_equal(a.bfill(axis=2), b2)

def test_truncate_fillna_bug(self):
# #1823
result = self.panel.truncate(before=None, after=None, axis='items')
Expand Down

0 comments on commit 4fb4dc9

Please sign in to comment.