Skip to content

REGR: Dataframe.agg no longer accepts positional arguments as of v1.1.0 #36948

Closed
@pganssle

Description

@pganssle

Currently, passing any positional arguments to the *args parameter of DataFrame.agg fails with a TypeError, but the documented behavior is that positional and keyword arguments are passed on to the function that you are aggregating with. A minimal reproducer:

import pandas as pd

def f(x, a):
    return x.sum() + a

df = pd.DataFrame([1, 2])

print(df.agg(f, 0, 3))

This is a regression introduced in v1.1.0, which was introduced in 433c900 (GH-34377), and it was mainly because the previous code only incidentally worked. Prior to the "offending" commit, all TypeErrors were caught and .agg would fall back to apply. This was incidentally (as far as I can tell) catching the TypeError raised from the fact that the self._aggregate call passed axis as a keyword argument, so:

self._aggregate(func, axis=axis, *args, **kwargs)

...

def aggregate(self, func, axis, *args, **kwargs):
   ...

This means that aggregate takes func and the first positional argument from *args as func and axis, then takes axis=1 to be axis, raising TypeError because axis is specified twice.

I believe the solution here is to pass axis to self._aggregate by position.

Metadata

Metadata

Assignees

No one assigned

    Labels

    ApplyApply, Aggregate, Transform, MapBugRegressionFunctionality that used to work in a prior pandas version

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions