有没有办法在Pandas DataFrame的子类中的访问器上覆盖loc,iloc,以便在传递到父类(DataFrame)中的相应访问器之前执行一些健全性检查?
官方文档提到添加新的访问者,但没有覆盖现有的访问者: https://pandas.pydata.org/pandas-docs/stable/extending.html
答案 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}}