Skip to content

Commit 533cec7

Browse files
committed
API: Closes #7879: (drops not nan in panel.to_frame() by default)
1 parent 9ef8534 commit 533cec7

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ Highlights include:
6363
- Development support for benchmarking with the `Air Speed Velocity library <https://github.com/spacetelescope/asv/>`_ (:issue:`8316`)
6464
- Support for reading SAS xport files, see :ref:`here <whatsnew_0170.enhancements.sas_xport>`
6565
- Removal of the automatic TimeSeries broadcasting, deprecated since 0.8.0, see :ref:`here <whatsnew_0170.prior_deprecations>`
66+
- Deprecated ``filter_observations`` by ``dropna`` in ``Panel.to_frame`` and changed default to ``True`` (:issue:`7879`)
6667

6768
See the :ref:`v0.17.0 Whatsnew <whatsnew_0170>` overview for an extensive list
6869
of all enhancements and bugs that have been fixed in 0.17.0.

pandas/core/panel.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -862,15 +862,20 @@ def groupby(self, function, axis='major'):
862862
axis = self._get_axis_number(axis)
863863
return PanelGroupBy(self, function, axis=axis)
864864

865-
def to_frame(self, filter_observations=True):
865+
@deprecate_kwarg(old_arg_name='filter_observations', new_arg_name='dropna')
866+
def to_frame(self, dropna=False):
866867
"""
867868
Transform wide format into long (stacked) format as DataFrame whose
868869
columns are the Panel's items and whose index is a MultiIndex formed
869870
of the Panel's major and minor axes.
870871
871872
Parameters
872873
----------
873-
filter_observations : boolean, default True
874+
dropna : boolean, default False
875+
Drop (major, minor) pairs without a complete set of observations
876+
across all the items
877+
878+
filter_observations : boolean, default False, [deprecated]
874879
Drop (major, minor) pairs without a complete set of observations
875880
across all the items
876881
@@ -880,7 +885,7 @@ def to_frame(self, filter_observations=True):
880885
"""
881886
_, N, K = self.shape
882887

883-
if filter_observations:
888+
if dropna is True:
884889
# shaped like the return DataFrame
885890
mask = com.notnull(self.values).all(axis=0)
886891
# size = mask.sum()

pandas/tests/test_panel.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -1525,19 +1525,19 @@ def test_transpose_copy(self):
15251525

15261526
def test_to_frame(self):
15271527
# filtered
1528-
filtered = self.panel.to_frame()
1528+
filtered = self.panel.to_frame(dropna=True)
15291529
expected = self.panel.to_frame().dropna(how='any')
15301530
assert_frame_equal(filtered, expected)
15311531

15321532
# unfiltered
1533-
unfiltered = self.panel.to_frame(filter_observations=False)
1533+
unfiltered = self.panel.to_frame(dropna=False)
15341534
assert_panel_equal(unfiltered.to_panel(), self.panel)
15351535

15361536
# names
15371537
self.assertEqual(unfiltered.index.names, ('major', 'minor'))
15381538

15391539
# unsorted, round trip
1540-
df = self.panel.to_frame(filter_observations=False)
1540+
df = self.panel.to_frame(dropna=False)
15411541
unsorted = df.take(np.random.permutation(len(df)))
15421542
pan = unsorted.to_panel()
15431543
assert_panel_equal(pan, self.panel)
@@ -1554,6 +1554,10 @@ def test_to_frame(self):
15541554
self.assertEqual(rdf.index.names, df.index.names)
15551555
self.assertEqual(rdf.columns.names, df.columns.names)
15561556

1557+
# test kw filter_observations deprecation
1558+
with tm.assert_produces_warning(Warning):
1559+
filtered = self.panel.to_frame(filter_observations=True)
1560+
15571561
def test_to_frame_mixed(self):
15581562
panel = self.panel.fillna(0)
15591563
panel['str'] = 'foo'
@@ -1597,7 +1601,7 @@ def test_to_frame_multi_major(self):
15971601
assert_frame_equal(result, expected)
15981602

15991603
wp.iloc[0, 0].iloc[0] = np.nan # BUG on setting. GH #5773
1600-
result = wp.to_frame()
1604+
result = wp.to_frame(dropna=True)
16011605
assert_frame_equal(result, expected[1:])
16021606

16031607
idx = MultiIndex.from_tuples([(1, 'two'), (1, 'one'), (2, 'one'),
@@ -1651,7 +1655,7 @@ def test_to_frame_multi_drop_level(self):
16511655
idx = MultiIndex.from_tuples([(1, 'one'), (2, 'one'), (2, 'two')])
16521656
df = DataFrame({'A': [np.nan, 1, 2]}, index=idx)
16531657
wp = Panel({'i1': df, 'i2': df})
1654-
result = wp.to_frame()
1658+
result = wp.to_frame(dropna=True)
16551659
exp_idx = MultiIndex.from_tuples([(2, 'one', 'A'), (2, 'two', 'A')],
16561660
names=[None, None, 'minor'])
16571661
expected = DataFrame({'i1': [1., 2], 'i2': [1., 2]}, index=exp_idx)
@@ -2210,7 +2214,7 @@ def setUp(self):
22102214
tm.add_nans(panel)
22112215

22122216
self.panel = panel.to_frame()
2213-
self.unfiltered_panel = panel.to_frame(filter_observations=False)
2217+
self.unfiltered_panel = panel.to_frame(dropna=False)
22142218

22152219
def test_ops_differently_indexed(self):
22162220
# trying to set non-identically indexed panel

0 commit comments

Comments
 (0)