Skip to content

Commit 6b9035c

Browse files
author
Alex Hutton
committed
Preserve sparse dtype when reindexing
- This is currently broken due to many tests relying on possibly broken behaviour. - BUG #26123.
1 parent 947bd76 commit 6b9035c

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

pandas/core/generic.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -4502,7 +4502,7 @@ def reindex_axis(self, labels, axis=0, method=None, level=None, copy=True,
45024502
fill_value=fill_value, copy=copy)
45034503

45044504
def _reindex_with_indexers(self, reindexers, fill_value=None, copy=False,
4505-
allow_dups=False):
4505+
allow_dups=False, preserve_dtype=False):
45064506
"""allow_dups indicates an internal call here """
45074507

45084508
# reindex doing multiple operations on different axes if indicated
@@ -4527,7 +4527,8 @@ def _reindex_with_indexers(self, reindexers, fill_value=None, copy=False,
45274527
if copy and new_data is self._data:
45284528
new_data = new_data.copy()
45294529

4530-
return self._constructor(new_data).__finalize__(self)
4530+
kwargs = {'dtype': self._data.dtype} if preserve_dtype else {}
4531+
return self._constructor(new_data, **kwargs).__finalize__(self)
45314532

45324533
def filter(self, items=None, like=None, regex=None, axis=None):
45334534
"""

pandas/core/sparse/series.py

+10
Original file line numberDiff line numberDiff line change
@@ -464,10 +464,20 @@ def copy(self, deep=True):
464464
def reindex(self, index=None, method=None, copy=True, limit=None,
465465
**kwargs):
466466
# TODO: remove?
467+
fill_value = kwargs.pop('fill_value', None)
468+
if fill_value is None:
469+
fill_value = self.fill_value
467470
return super(SparseSeries, self).reindex(index=index, method=method,
471+
fill_value=fill_value,
468472
copy=copy, limit=limit,
469473
**kwargs)
470474

475+
def _reindex_with_indexers(self, *args, **kwargs):
476+
return super(SparseSeries, self)._reindex_with_indexers(
477+
*args,
478+
preserve_dtype=True,
479+
**kwargs)
480+
471481
def sparse_reindex(self, new_index):
472482
"""
473483
Conform sparse values to new SparseIndex

pandas/tests/sparse/series/test_series.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import pandas as pd
1414
from pandas import (
15-
DataFrame, Series, SparseDtype, SparseSeries, bdate_range, isna)
15+
DataFrame, Series, SparseDtype, SparseSeries, bdate_range)
1616
from pandas.core.reshape.util import cartesian_product
1717
import pandas.core.sparse.frame as spf
1818
from pandas.tests.series.test_api import SharedWithSparse
@@ -309,7 +309,7 @@ def test_constructor_scalar(self):
309309
sp = SparseSeries(data, np.arange(100))
310310
sp = sp.reindex(np.arange(200))
311311
assert (sp.loc[:99] == data).all()
312-
assert isna(sp.loc[100:]).all()
312+
assert sp.loc[100:].isin((0,)).all()
313313

314314
data = np.nan
315315
sp = SparseSeries(data, np.arange(100))
@@ -1031,6 +1031,11 @@ def test_memory_usage_deep(self, deep, fill_value):
10311031

10321032
assert sparse_usage < dense_usage
10331033

1034+
@pytest.mark.parametrize('dtype', (np.float32, np.int32, np.bool))
1035+
def test_resize_preserves_dtype(self, dtype):
1036+
s = pd.SparseSeries([1, 0], dtype=dtype)
1037+
assert s.dtype == s.reindex([0, 1, 2]).dtype
1038+
10341039

10351040
class TestSparseHandlingMultiIndexes:
10361041

0 commit comments

Comments
 (0)