Closed
Description
# 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.