Skip to content

Commit 02ef2c5

Browse files
committed
BUG: fix SparseSeries.combine_first work when passed dense Series, make SparseDataFrame.combine_first work also, GH #687
1 parent 20eeb12 commit 02ef2c5

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

pandas/sparse/frame.py

+14
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from pandas.core.frame import (DataFrame, extract_index, _prep_ndarray,
1515
_default_index)
1616
from pandas.util.decorators import cache_readonly
17+
import pandas.core.common as com
1718
import pandas.core.datetools as datetools
1819

1920
from pandas.sparse.series import SparseSeries
@@ -526,6 +527,19 @@ def _reindex_columns(self, columns, copy, level):
526527
return SparseDataFrame(sdict, index=self.index, columns=columns,
527528
default_fill_value=self.default_fill_value)
528529

530+
def _reindex_with_indexers(self, index, row_indexer, columns, col_indexer,
531+
copy):
532+
if columns is None:
533+
columns = self.columns
534+
535+
new_arrays = {}
536+
for col in columns:
537+
if col not in self:
538+
continue
539+
new_arrays[col] = com.take_1d(self[col].values, row_indexer)
540+
541+
return self._constructor(new_arrays, index=index, columns=columns)
542+
529543
def _rename_index_inplace(self, mapper):
530544
self.index = [mapper(x) for x in self.index]
531545

pandas/sparse/series.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,10 @@ def combine_first(self, other):
501501
-------
502502
y : Series
503503
"""
504-
dense_combined = self.to_dense().combine_first(other.to_dense())
504+
if isinstance(other, SparseSeries):
505+
other = other.to_dense()
506+
507+
dense_combined = self.to_dense().combine_first(other)
505508
return dense_combined.to_sparse(fill_value=self.fill_value)
506509

507510
class SparseTimeSeries(SparseSeries, TimeSeries):

pandas/sparse/tests/test_sparse.py

+24
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,18 @@ def test_cumsum(self):
643643
self.assert_(isinstance(result, Series))
644644
assert_series_equal(result, expected)
645645

646+
def test_combine_first(self):
647+
s = self.bseries
648+
649+
result = s[::2].combine_first(s)
650+
result2 = s[::2].combine_first(s.to_dense())
651+
652+
expected = s[::2].to_dense().combine_first(s.to_dense())
653+
expected = expected.to_sparse(fill_value=s.fill_value)
654+
655+
assert_sp_series_equal(result, result2)
656+
assert_sp_series_equal(result, expected)
657+
646658
class TestSparseTimeSeries(TestCase):
647659
pass
648660

@@ -1194,6 +1206,18 @@ def _check_all(self, check_func):
11941206
check_func(self.zframe)
11951207
check_func(self.fill_frame)
11961208

1209+
def test_combine_first(self):
1210+
df = self.frame
1211+
1212+
result = df[::2].combine_first(df)
1213+
result2 = df[::2].combine_first(df.to_dense())
1214+
1215+
expected = df[::2].to_dense().combine_first(df.to_dense())
1216+
expected = expected.to_sparse(fill_value=df.default_fill_value)
1217+
1218+
assert_sp_frame_equal(result, result2)
1219+
assert_sp_frame_equal(result, expected)
1220+
11971221
def _dense_series_compare(s, f):
11981222
result = f(s)
11991223
assert(isinstance(result, SparseSeries))

0 commit comments

Comments
 (0)