Skip to content

Commit 207e0ce

Browse files
Zekejreback
Zeke
authored andcommitted
BUG: to_sparse was dropping MultiIndex column names, #11600
1 parent 4ffc3ef commit 207e0ce

File tree

4 files changed

+22
-3
lines changed

4 files changed

+22
-3
lines changed

doc/source/whatsnew/v0.17.1.txt

+1
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,4 @@ Bug Fixes
189189
- Bug in ``Series.quantile`` with empty list results has ``Index`` with ``object`` dtype (:issue:`11588`)
190190
- Bug in ``pd.merge`` results in empty ``Int64Index`` rather than ``Index(dtype=object)`` when the merge result is empty (:issue:`11588`)
191191
- Bug in ``remove_unused_categories`` when having ``NaN`` values (:issue:`11599`).
192+
- Bug in ``DataFrame.to_sparse()`` loses column names for MultiIndexes (:issue:`11600`)

pandas/core/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1191,7 +1191,7 @@ def to_sparse(self, fill_value=None, kind='block'):
11911191
y : SparseDataFrame
11921192
"""
11931193
from pandas.core.sparse import SparseDataFrame
1194-
return SparseDataFrame(self._series, index=self.index,
1194+
return SparseDataFrame(self._series, index=self.index, columns=self.columns,
11951195
default_kind=kind,
11961196
default_fill_value=fill_value)
11971197

pandas/sparse/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ def to_dense(self):
246246
df : DataFrame
247247
"""
248248
data = dict((k, v.to_dense()) for k, v in compat.iteritems(self))
249-
return DataFrame(data, index=self.index)
249+
return DataFrame(data, index=self.index,columns=self.columns)
250250

251251
def astype(self, dtype):
252252
raise NotImplementedError

pandas/sparse/tests/test_sparse.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import pandas as pd
1212
dec = np.testing.dec
1313

14-
from pandas.util.testing import (assert_almost_equal, assert_series_equal,
14+
from pandas.util.testing import (assert_almost_equal, assert_series_equal, assert_index_equal,
1515
assert_frame_equal, assert_panel_equal, assertRaisesRegexp,
1616
assert_numpy_array_equal, assert_attr_equal)
1717
from numpy.testing import assert_equal
@@ -770,6 +770,24 @@ def test_combine_first(self):
770770
assert_sp_series_equal(result, result2)
771771
assert_sp_series_equal(result, expected)
772772

773+
class TestSparseHandlingMultiIndexes(tm.TestCase):
774+
775+
def setUp(self):
776+
miindex = pd.MultiIndex.from_product([["x","y"], ["10","20"]],names=['row-foo', 'row-bar'])
777+
micol = pd.MultiIndex.from_product([['a','b','c'], ["1","2"]],names=['col-foo', 'col-bar'])
778+
dense_multiindex_frame = pd.DataFrame(index=miindex, columns=micol).sortlevel().sortlevel(axis=1)
779+
self.dense_multiindex_frame = dense_multiindex_frame.fillna(value=3.14)
780+
781+
def test_to_sparse_preserve_multiindex_names_columns(self):
782+
sparse_multiindex_frame = self.dense_multiindex_frame.to_sparse().copy()
783+
assert_index_equal(sparse_multiindex_frame.columns,self.dense_multiindex_frame.columns)
784+
785+
def test_round_trip_preserve_multiindex_names(self):
786+
sparse_multiindex_frame = self.dense_multiindex_frame.to_sparse()
787+
round_trip_multiindex_frame = sparse_multiindex_frame.to_dense()
788+
assert_frame_equal(self.dense_multiindex_frame,round_trip_multiindex_frame,
789+
check_column_type=True,check_names=True)
790+
773791

774792
class TestSparseSeriesScipyInteraction(tm.TestCase):
775793
# Issue 8048: add SparseSeries coo methods

0 commit comments

Comments
 (0)