[Python] _metadata properties do not work with pyjanitor

Discussão em 'Python' iniciado por Stack, Maio 20, 2025.

  1. Stack

    Stack Membro Participativo

    _matadata original properties are not pased to pyjanitor manipulation results

    Take the following MWE:

    import pandas as pd
    import janitor # noqa: F401
    import pandas_flavor as pf

    # See: https://pandas.pydata.org/pandas-docs/stable/development/extending.html#define-original-properties
    class MyDataFrame(pd.DataFrame):

    # normal properties
    _metadata = ["myvar"]

    @property
    def _constructor(self):
    return MyDataFrame

    @pf.register_dataframe_method
    def regvar(self):
    obj = MyDataFrame(self)
    obj.myvar = 2
    return obj

    @pf.register_dataframe_method
    def printvar(self):
    print(self.myvar)
    return self

    df = pd.DataFrame(
    {
    "Year": [1999, 2000, 2004, 1999, 2004],
    "Taxon": [
    "Saccharina",
    "Saccharina",
    "Saccharina",
    "Agarum",
    "Agarum",
    ],
    "Abundance": [4, 5, 2, 1, 8],
    }
    )


    Now:

    df2 = df.regvar().query("Taxon=='Saccharina'").printvar()


    This correctly returns 2.

    However:

    index = pd.Index(range(1999,2005),name='Year')
    df2 = df.regvar().complete(index, "Taxon", sort=True).printvar()


    Returns an Exception:

    ---------------------------------------------------------------------------
    AttributeError Traceback (most recent call last)
    ~\AppData\Local\Temp\ipykernel_4412\627945022.py in ?()
    39
    40 df2 = df.regvar().query("Taxon=='Saccharina'").printvar()
    41
    42 index = pd.Index(range(1999,2005),name='Year')
    ---> 43 df2 = df.regvar().complete(index, "Taxon", sort=True).printvar()

    HOME\venvs\base\Lib\site-packages\pandas_flavor\register.py in ?(self, *args, **kwargs)
    160 object: The result of calling of the method.
    161 """
    162 global method_call_ctx_factory
    163 if method_call_ctx_factory is None:
    --> 164 return method(self._obj, *args, **kwargs)
    165
    166 return handle_pandas_extension_call(
    167 method, method_signature, self._obj, args, kwargs

    ~\AppData\Local\Temp\ipykernel_4412\627945022.py in ?(self)
    21 @pf.register_dataframe_method
    22 def printvar(self):
    ---> 23 print(self.myvar)
    24 return self

    HOME\venvs\base\Lib\site-packages\pandas\core\generic.py in ?(self, name)
    6295 and name not in self._accessors
    6296 and self._info_axis._can_hold_identifiers_and_holds_name(name)
    6297 ):
    6298 return self[name]
    -> 6299 return object.__getattribute__(self, name)

    AttributeError: 'DataFrame' object has no attribute 'myvar'

    Continue reading...

Compartilhe esta Página