pandas.api.extensions.register_dataframe_accessor

pandas.api.extensions.register_dataframe_accessor(name)[source]

Register a custom accessor on DataFrame objects.

Parameters
namestr

Name under which the accessor should be registered. A warning is issued if this name conflicts with a preexisting attribute.

Returns
callable

A class decorator.

Notes

When accessed, your accessor will be initialized with the pandas object the user is interacting with. So the signature must be

def __init__(self, pandas_object):  # noqa: E999
    ...

For consistency with pandas methods, you should raise an AttributeError if the data passed to your accessor has an incorrect dtype.

>>> pd.Series(['a', 'b']).dt
Traceback (most recent call last):
...
AttributeError: Can only use .dt accessor with datetimelike values

Examples

In your library code:

import pandas as pd

@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()))

    def plot(self):
        # plot this array's data on a map, e.g., using Cartopy
        pass

Back in an interactive IPython session:

>>> ds = pd.DataFrame({'longitude': np.linspace(0, 10),
...                    'latitude': np.linspace(0, 20)})
>>> ds.geo.center
(5.0, 10.0)
>>> ds.geo.plot()
# plots data on a map