diff --git a/doc/source/release.rst b/doc/source/release.rst
index 6e74e2c68e44e..06f6b64c93061 100644
--- a/doc/source/release.rst
+++ b/doc/source/release.rst
@@ -63,6 +63,7 @@ Highlights include:
- Development support for benchmarking with the `Air Speed Velocity library `_ (:issue:`8316`)
- Support for reading SAS xport files, see :ref:`here `
- Removal of the automatic TimeSeries broadcasting, deprecated since 0.8.0, see :ref:`here `
+- Deprecated ``filter_observations`` by ``dropna`` in ``Panel.to_frame`` and changed default to ``True`` (:issue:`7879`)
See the :ref:`v0.17.0 Whatsnew ` overview for an extensive list
of all enhancements and bugs that have been fixed in 0.17.0.
diff --git a/pandas/core/panel.py b/pandas/core/panel.py
index 1293b4034b84e..5e24d765ca5c5 100644
--- a/pandas/core/panel.py
+++ b/pandas/core/panel.py
@@ -862,7 +862,8 @@ def groupby(self, function, axis='major'):
axis = self._get_axis_number(axis)
return PanelGroupBy(self, function, axis=axis)
- def to_frame(self, filter_observations=True):
+ @deprecate_kwarg(old_arg_name='filter_observations', new_arg_name='dropna')
+ def to_frame(self, dropna=False):
"""
Transform wide format into long (stacked) format as DataFrame whose
columns are the Panel's items and whose index is a MultiIndex formed
@@ -870,7 +871,11 @@ def to_frame(self, filter_observations=True):
Parameters
----------
- filter_observations : boolean, default True
+ dropna : boolean, default False
+ Drop (major, minor) pairs without a complete set of observations
+ across all the items
+
+ filter_observations : boolean, default False, [deprecated]
Drop (major, minor) pairs without a complete set of observations
across all the items
@@ -880,7 +885,7 @@ def to_frame(self, filter_observations=True):
"""
_, N, K = self.shape
- if filter_observations:
+ if dropna is True:
# shaped like the return DataFrame
mask = com.notnull(self.values).all(axis=0)
# size = mask.sum()
diff --git a/pandas/tests/test_panel.py b/pandas/tests/test_panel.py
index 7c67ded16139c..50ed5f092c979 100644
--- a/pandas/tests/test_panel.py
+++ b/pandas/tests/test_panel.py
@@ -1525,19 +1525,19 @@ def test_transpose_copy(self):
def test_to_frame(self):
# filtered
- filtered = self.panel.to_frame()
+ filtered = self.panel.to_frame(dropna=True)
expected = self.panel.to_frame().dropna(how='any')
assert_frame_equal(filtered, expected)
# unfiltered
- unfiltered = self.panel.to_frame(filter_observations=False)
+ unfiltered = self.panel.to_frame(dropna=False)
assert_panel_equal(unfiltered.to_panel(), self.panel)
# names
self.assertEqual(unfiltered.index.names, ('major', 'minor'))
# unsorted, round trip
- df = self.panel.to_frame(filter_observations=False)
+ df = self.panel.to_frame(dropna=False)
unsorted = df.take(np.random.permutation(len(df)))
pan = unsorted.to_panel()
assert_panel_equal(pan, self.panel)
@@ -1554,6 +1554,10 @@ def test_to_frame(self):
self.assertEqual(rdf.index.names, df.index.names)
self.assertEqual(rdf.columns.names, df.columns.names)
+ # test kw filter_observations deprecation
+ with tm.assert_produces_warning(Warning):
+ filtered = self.panel.to_frame(filter_observations=True)
+
def test_to_frame_mixed(self):
panel = self.panel.fillna(0)
panel['str'] = 'foo'
@@ -1597,7 +1601,7 @@ def test_to_frame_multi_major(self):
assert_frame_equal(result, expected)
wp.iloc[0, 0].iloc[0] = np.nan # BUG on setting. GH #5773
- result = wp.to_frame()
+ result = wp.to_frame(dropna=True)
assert_frame_equal(result, expected[1:])
idx = MultiIndex.from_tuples([(1, 'two'), (1, 'one'), (2, 'one'),
@@ -1651,7 +1655,7 @@ def test_to_frame_multi_drop_level(self):
idx = MultiIndex.from_tuples([(1, 'one'), (2, 'one'), (2, 'two')])
df = DataFrame({'A': [np.nan, 1, 2]}, index=idx)
wp = Panel({'i1': df, 'i2': df})
- result = wp.to_frame()
+ result = wp.to_frame(dropna=True)
exp_idx = MultiIndex.from_tuples([(2, 'one', 'A'), (2, 'two', 'A')],
names=[None, None, 'minor'])
expected = DataFrame({'i1': [1., 2], 'i2': [1., 2]}, index=exp_idx)
@@ -2210,7 +2214,7 @@ def setUp(self):
tm.add_nans(panel)
self.panel = panel.to_frame()
- self.unfiltered_panel = panel.to_frame(filter_observations=False)
+ self.unfiltered_panel = panel.to_frame(dropna=False)
def test_ops_differently_indexed(self):
# trying to set non-identically indexed panel