Технически это не очень сложно:
class SafeLoc(object):
def __init__(df):
self._df = df
...
class SafeDataFrame(pd.DataFrame):
def loc(self):
return SafeLoc(self)
Однако я думаю, что это не очень хорошая идея.Рассмотрим этот код:
df = SafeDataFrame()
df.loc['b'] # does one thing
df.abs().loc['b'] # does a different thing
Мне кажется невозможным отслеживать все операции, выполняемые на вашем подклассе, и обеспечивать создание объектов вашего подкласса тоже.Результат будет очень подвержен ошибкам.
Вместо этого, как вы заметили, pandas дает вам механизм для выполнения чего-то более безопасного :
class SafeLoc(object):
def __init__(df):
self._df = df
...
@pd.api.extensions.register_dataframe_accessor("safe")
class SafeAccessor(object):
def __init__(self, pandas_obj):
self._obj = pandas_obj
@property
def loc(self):
return SafeLoc(self._obj)
и теперьВы можете использовать
df = pd.DataFrame()
df.safe.loc['b'] # does one thing
df.abs().safe.loc['b'] # does the same thing