diff --git a/pandas/core/generic.py b/pandas/core/generic.py index bf8c6acae0445..363b29da31e08 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -4502,7 +4502,7 @@ def reindex_axis(self, labels, axis=0, method=None, level=None, copy=True, fill_value=fill_value, copy=copy) def _reindex_with_indexers(self, reindexers, fill_value=None, copy=False, - allow_dups=False): + allow_dups=False, preserve_dtype=False): """allow_dups indicates an internal call here """ # reindex doing multiple operations on different axes if indicated @@ -4527,7 +4527,8 @@ def _reindex_with_indexers(self, reindexers, fill_value=None, copy=False, if copy and new_data is self._data: new_data = new_data.copy() - return self._constructor(new_data).__finalize__(self) + kwargs = {'dtype': self._data.dtype} if preserve_dtype else {} + return self._constructor(new_data, **kwargs).__finalize__(self) def filter(self, items=None, like=None, regex=None, axis=None): """ diff --git a/pandas/core/sparse/series.py b/pandas/core/sparse/series.py index 11231ce90b6b9..763864c6cafab 100644 --- a/pandas/core/sparse/series.py +++ b/pandas/core/sparse/series.py @@ -464,10 +464,20 @@ def copy(self, deep=True): def reindex(self, index=None, method=None, copy=True, limit=None, **kwargs): # TODO: remove? + fill_value = kwargs.pop('fill_value', None) + if fill_value is None: + fill_value = self.fill_value return super(SparseSeries, self).reindex(index=index, method=method, + fill_value=fill_value, copy=copy, limit=limit, **kwargs) + def _reindex_with_indexers(self, *args, **kwargs): + return super(SparseSeries, self)._reindex_with_indexers( + *args, + preserve_dtype=True, + **kwargs) + def sparse_reindex(self, new_index): """ Conform sparse values to new SparseIndex diff --git a/pandas/tests/sparse/series/test_series.py b/pandas/tests/sparse/series/test_series.py index 88921cf932140..155fa91eda2b4 100644 --- a/pandas/tests/sparse/series/test_series.py +++ b/pandas/tests/sparse/series/test_series.py @@ -12,7 +12,7 @@ import pandas as pd from pandas import ( - DataFrame, Series, SparseDtype, SparseSeries, bdate_range, isna) + DataFrame, Series, SparseDtype, SparseSeries, bdate_range) from pandas.core.reshape.util import cartesian_product import pandas.core.sparse.frame as spf from pandas.tests.series.test_api import SharedWithSparse @@ -309,7 +309,7 @@ def test_constructor_scalar(self): sp = SparseSeries(data, np.arange(100)) sp = sp.reindex(np.arange(200)) assert (sp.loc[:99] == data).all() - assert isna(sp.loc[100:]).all() + assert sp.loc[100:].isin((0,)).all() data = np.nan sp = SparseSeries(data, np.arange(100)) @@ -1031,6 +1031,11 @@ def test_memory_usage_deep(self, deep, fill_value): assert sparse_usage < dense_usage + @pytest.mark.parametrize('dtype', (np.float32, np.int32, np.bool)) + def test_resize_preserves_dtype(self, dtype): + s = pd.SparseSeries([1, 0], dtype=dtype) + assert s.dtype == s.reindex([0, 1, 2]).dtype + class TestSparseHandlingMultiIndexes: