Skip to content

DataFrame align() on a subclassed DataFrame does not invoke _constructor() for the subclassed DataFrame #12983

Closed
@amanhanda

Description

@amanhanda
# my_dataframe.py
import pandas as pd


class MySeries(pd.Series):
    @property
    def _constructor(self):
        return MySeries

    @property
    def _constructor_expanddim(self):
        return MyDataFrame


class MyDataFrame(pd.DataFrame):
    def __init__(self, data=None, index=None, columns=None, dtype=None, copy=False, **kwargs):
        super(MyDataFrame, self).__init__(data=data, index=index, columns=columns, dtype=dtype, copy=copy, **kwargs)

    @property
    def _constructor(self):
        return MyDataFrame

    @property
    def _constructor_sliced(self):
        return MySeries

    @property
    def _constructor_expanddim(self):
        return MyPanel


class MyPanel(pd.Panel):
    def __init__(self, data=None, items=None, major_axis=None, minor_axis=None, copy=False, dtype=None, **kwargs):
        super(MyPanel, self).__init__(data=data, items=items, major_axis=major_axis, minor_axis=minor_axis, copy=copy,
                                      dtype=dtype, **kwargs)

    @property
    def _constructor(self):
        return MyPanel

    @property
    def _constructor_sliced(self):
        return MyDataFrame

def f():
    df1 = MyDataFrame(pd.DataFrame([1, 2, 3, 4, 5], columns=['A']))
    df2 = MyDataFrame(pd.DataFrame([1, 2, 3, 4, 5], columns=['A']))
    print type(df1.align(df2, axis=0)[0])  # Note, if aligning with frame, it works fine, returns MyDataFrame
    print type(df1.align(df2.A, axis=0)[0])  # But if aligning with series, it does not, returns DataFrame

# import my_dataframe
 my_dataframe.f()
<class 'com.utils.my_dataframe.MyDataFrame'> # Correct 
<class 'pandas.core.frame.DataFrame'> # Does not invoke _constructor()

When aligning with a series, the code seems to explicitly create the DataFrame using DataFrame() constructor.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Compatpandas objects compatability with Numpy or Python functions

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions