BUG: Slicing subclasses of SparseDataFrames. by sstanovnik · Pull Request #13787 · pandas-dev/pandas (original) (raw)

This changes SparseDataFrame to use proper subclassing functionality so slicing of subclasses of SparseDataFrame works. Example of a failure that this PR fixes:

import pandas as pd

class DenseSubclassDF(pd.DataFrame): _constructor = property(lambda self: DenseSubclassDF) _constructor_sliced = property(lambda self: DenseSubclassS)

class DenseSubclassS(pd.Series): _constructor = property(lambda self: DenseSubclassS) _constructor_expanddim = property(lambda self: DenseSubclassDF)

class SparseSubclassDF(pd.SparseDataFrame): _constructor = property(lambda self: SparseSubclassDF) _constructor_sliced = property(lambda self: SparseSubclassS)

class SparseSubclassS(pd.SparseSeries): _constructor = property(lambda self: SparseSubclassS) _constructor_expanddim = property(lambda self: SparseSubclassDF)

ddf = DenseSubclassDF([[1,2,3], [4,5,6], [7,8,9]]) sdf = SparseSubclassDF([[1,2,3], [4,5,6], [7,8,9]])

print(type(ddf.iloc[0])) # <class '__main__.DenseSubclassS'> print(type(ddf.iloc[:2])) # <class '__main__.DenseSubclassDF'> print(type(ddf[:2])) # <class '__main__.DenseSubclassDF'>

sparse doesn't preserve types

print(type(sdf.iloc[0])) # <class '__main__.SparseSubclassS'> print(type(sdf.iloc[:2])) # <class 'pandas.sparse.frame.SparseDataFrame'> print(type(sdf[:2])) # <class 'pandas.sparse.frame.SparseDataFrame'>