如何覆盖pandas dataframe子类中的访问器

时间:2018-05-17 19:51:31

标签: pandas

有没有办法在Pandas DataFrame的子类中的访问器上覆盖loc,iloc,以便在传递到父类(DataFrame)中的相应访问器之前执行一些健全性检查?

官方文档提到添加新的访问者,但没有覆盖现有的访问者: https://pandas.pydata.org/pandas-docs/stable/extending.html

1 个答案:

答案 0 :(得分:0)

从技术上讲,这并不困难:

df = SafeDataFrame()
df.loc['b'] # does one thing
df.abs().loc['b'] # does a different thing

但是,我认为这不是一个好主意。请考虑以下代码:

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)

在我看来,无法跟踪在子类上运行的所有操作,也无法确保子类的创建对象。结果将非常容易出错。

相反,正如您所指出的,pandas gives you a mechanism for doing something safer

df = pd.DataFrame()
df.safe.loc['b'] # does one thing
df.abs().safe.loc['b'] # does the same thing

现在你可以使用

{{1}}