如何防止pandas访问器发出覆盖警告?



我已经为pandas dataframes编写了一个访问器,与https://pandas.pydata.org/docs/reference/api/pandas.api.extensions.register_dataframe_accessor.html中的示例非常相似。

@pd.api.extensions.register_dataframe_accessor("geo")
class GeoAccessor:
def __init__(self, pandas_obj):
self._obj = pandas_obj
@property
def center(self):
# return the geographic center point of this DataFrame
lat = self._obj.latitude
lon = self._obj.longitude
return (float(lon.mean()), float(lat.mean()))
if __name__ == "__main__":
ds = pd.DataFrame({"longitude": np.linspace(0, 10),
"latitude": np.linspace(0, 20)})
print(ds.geo.center)
然而,当我第二次调用代码时,我得到一个警告消息
untitled3.py:12: UserWarning: registration of accessor <class '__main__.GeoAccessor'> under name 'geo' for type <class 'pandas.core.frame.DataFrame'> is overriding a preexisting attribute with the same name.
class GeoAccessor:

我试着把下面一行添加到顶部:

import warnings
warnings.filterwarnings(
"ignore", message="registration of accessor <class '__main__.GeoAccessor'>")

,但只有当所有内容都在一个文件中时才有效。只要将文件存储在"testlib.py"然后输入import testlib;在其他地方,我又得到了同样的警告。

任何想法吗?

在创建try/except块之前删除它。它可能不是很干净,但它适合我:

try:
#delete the accessor to avoid warning 
del pd.DataFrame.geo
except AttributeError:
pass
@pd.api.extensions.register_dataframe_accessor("geo")
class GeoAccessor:
...

我试图用xarray做同样的事情,但它不起作用,因为xarray访问器是只读的。我得到这个错误:

AttributeError: 'DataArray'对象属性'myaccessor'是只读的