Skip to content

Commit

Permalink
BUG: assign doesnt cast SparseDataFrame to DataFrame (#19178)
Browse files Browse the repository at this point in the history
  • Loading branch information
hexgnu authored and jreback committed Feb 12, 2018
1 parent a277108 commit 569bc7a
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 4 deletions.
1 change: 1 addition & 0 deletions doc/source/whatsnew/v0.23.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -822,6 +822,7 @@ Sparse
- Bug in which creating a ``SparseDataFrame`` from a dense ``Series`` or an unsupported type raised an uncontrolled exception (:issue:`19374`)
- Bug in :class:`SparseDataFrame.to_csv` causing exception (:issue:`19384`)
- Bug in :class:`SparseSeries.memory_usage` which caused segfault by accessing non sparse elements (:issue:`19368`)
- Bug in constructing a ``SparseArray``: if ``data`` is a scalar and ``index`` is defined it will coerce to ``float64`` regardless of scalar's dtype. (:issue:`19163`)

Reshaping
^^^^^^^^^
Expand Down
9 changes: 5 additions & 4 deletions pandas/core/sparse/array.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
is_scalar, is_dtype_equal)
from pandas.core.dtypes.cast import (
maybe_convert_platform, maybe_promote,
astype_nansafe, find_common_type)
astype_nansafe, find_common_type, infer_dtype_from_scalar,
construct_1d_arraylike_from_scalar)
from pandas.core.dtypes.missing import isna, notna, na_value_for_dtype

import pandas._libs.sparse as splib
Expand Down Expand Up @@ -162,9 +163,9 @@ def __new__(cls, data, sparse_index=None, index=None, kind='integer',
data = np.nan
if not is_scalar(data):
raise Exception("must only pass scalars with an index ")
values = np.empty(len(index), dtype='float64')
values.fill(data)
data = values
dtype = infer_dtype_from_scalar(data)[0]
data = construct_1d_arraylike_from_scalar(
data, len(index), dtype)

if isinstance(data, ABCSparseSeries):
data = data.values
Expand Down
11 changes: 11 additions & 0 deletions pandas/tests/sparse/frame/test_frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -1257,3 +1257,14 @@ def test_quantile_multi(self):

tm.assert_frame_equal(result, dense_expected)
tm.assert_sp_frame_equal(result, sparse_expected)

def test_assign_with_sparse_frame(self):
# GH 19163
df = pd.DataFrame({"a": [1, 2, 3]})
res = df.to_sparse(fill_value=False).assign(newcol=False)
exp = df.assign(newcol=False).to_sparse(fill_value=False)

tm.assert_sp_frame_equal(res, exp)

for column in res.columns:
assert type(res[column]) is SparseSeries
15 changes: 15 additions & 0 deletions pandas/tests/sparse/test_array.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,21 @@ def test_constructor_spindex_dtype(self):
assert arr.dtype == np.int64
assert arr.fill_value == 0

@pytest.mark.parametrize('scalar,dtype', [
(False, bool),
(0.0, 'float64'),
(1, 'int64'),
('z', 'object')])
def test_scalar_with_index_infer_dtype(self, scalar, dtype):
# GH 19163
arr = SparseArray(scalar, index=[1, 2, 3], fill_value=scalar)
exp = SparseArray([scalar, scalar, scalar], fill_value=scalar)

tm.assert_sp_array_equal(arr, exp)

assert arr.dtype == dtype
assert exp.dtype == dtype

def test_sparseseries_roundtrip(self):
# GH 13999
for kind in ['integer', 'block']:
Expand Down

0 comments on commit 569bc7a

Please sign in to comment.