Как переопределить аксессор в подклассе pandas dataframe - PullRequest
0 голосов
/ 17 мая 2018

Есть ли способ переопределить loc, iloc, у аксессоров в подклассе Pandas DataFrame, чтобы выполнить некоторые проверки работоспособности перед передачей на соответствующие аксессоры в родительском классе (DataFrame)?

Официальная документацияупоминает о добавлении новых методов доступа, но не о переопределении существующих: https://pandas.pydata.org/pandas-docs/stable/extending.html

1 Ответ

0 голосов
/ 18 мая 2018

Технически это не очень сложно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...