From 533cec76f79fdcbb2c461faf35eacb2012d1350b Mon Sep 17 00:00:00 2001 From: Henning Dickten Date: Wed, 26 Aug 2015 21:58:34 +0200 Subject: [PATCH] API: Closes #7879: (drops not nan in panel.to_frame() by default) --- doc/source/release.rst | 1 + pandas/core/panel.py | 11 ++++++++--- pandas/tests/test_panel.py | 16 ++++++++++------ 3 files changed, 19 insertions(+), 9 deletions(-) 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