diff --git a/pandas/sparse/frame.py b/pandas/sparse/frame.py index cfbe5ea2ee0ed..bf978c322dbd2 100644 --- a/pandas/sparse/frame.py +++ b/pandas/sparse/frame.py @@ -42,6 +42,11 @@ def shape(self): def axes(self): return [self.sp_frame.columns, self.sp_frame.index] + @property + def blocks(self): + """ return our series in the column order """ + s = self.sp_frame._series + return [ self.iget(i) for i in self.sp_frame.columns ] class SparseDataFrame(DataFrame): """ @@ -235,6 +240,13 @@ def to_dense(self): data = dict((k, v.to_dense()) for k, v in self.iteritems()) return DataFrame(data, index=self.index) + def get_dtype_counts(self): + from collections import defaultdict + d = defaultdict(int) + for k, v in self.iteritems(): + d[v.dtype.name] += 1 + return Series(d) + def astype(self, dtype): raise NotImplementedError diff --git a/pandas/sparse/tests/test_sparse.py b/pandas/sparse/tests/test_sparse.py index 1202649afed84..af9112b8297be 100644 --- a/pandas/sparse/tests/test_sparse.py +++ b/pandas/sparse/tests/test_sparse.py @@ -821,6 +821,39 @@ def test_constructor_convert_index_once(self): sdf = SparseDataFrame(columns=range(4), index=arr) self.assertTrue(sdf[0].index is sdf[1].index) + def test_constructor_from_series(self): + + # GH 2873 + x = Series(np.random.randn(10000), name='a') + x = x.to_sparse(fill_value=0) + self.assert_(isinstance(x,SparseSeries)) + df = SparseDataFrame(x) + self.assert_(isinstance(df,SparseDataFrame)) + + x = Series(np.random.randn(10000), name ='a') + y = Series(np.random.randn(10000), name ='b') + x.ix[:9998] = 0 + x = x.to_sparse(fill_value=0) + + # currently fails + #df1 = SparseDataFrame([x, y]) + + def test_dtypes(self): + df = DataFrame(np.random.randn(10000, 4)) + df.ix[:9998] = np.nan + sdf = df.to_sparse() + + result = sdf.get_dtype_counts() + expected = Series({ 'float64' : 4 }) + assert_series_equal(result, expected) + + def test_str(self): + df = DataFrame(np.random.randn(10000, 4)) + df.ix[:9998] = np.nan + sdf = df.to_sparse() + + str(sdf) + def test_array_interface(self): res = np.sqrt(self.frame) dres = np.sqrt(self.frame.to_dense())