pandas groupby中的聚合函数是否以不同方式处理内置函数?

Sim*_*wly 5 python pandas pandas-groupby

在讨论/sf/answers/3328014651/时遇到了这种看似奇怪的行为.

OP有这个数据帧:

x = pd.DataFrame.from_dict({
    'cat1':['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    'cat2':['X', 'X', 'Y', 'Y', 'Y', 'Y', 'Z', 'Z']})
Run Code Online (Sandbox Code Playgroud)

并希望cat2为每组值找到唯一cat1值.

一种选择是聚合并使用lambda来创建一组唯一值:

x.groupby('cat1').agg(lambda x: set(x))

# Returns
        cat2
cat1        
A     {X, Y}
B        {Y}
C     {Z, Y}
Run Code Online (Sandbox Code Playgroud)

我假设使用set它本身就相当于lambda,因为它是可调用的,但是:

x.groupby('cat1').agg(set)

# Returns
              cat2
cat1              
A     {cat1, cat2}
B     {cat1, cat2}
C     {cat1, cat2}
Run Code Online (Sandbox Code Playgroud)

lambda如果我定义一个正确的函数,我会得到与该方法相同的行为,通过这样做,我可以看到pandas调用函数与a Series.它似乎set是用a调用的DataFrame,因此它在迭代对象时返回一组列名.

这似乎是不一致的行为.谁能解释为什么Pandas对内置函数的处理方式不同?

编辑

观察SeriesGroupBy.agg行为可能会提供更多的洞察力.将任何类型传递给此函数会导致错误"TypeError:'type'对象不可迭代".

x.groupby('cat1')['cat2'].agg(set)
Run Code Online (Sandbox Code Playgroud)

ojd*_*jdo 1

现在这种行为似乎已经改变了。至少在 0.23.0 版本中,lambda x: set(x)和的set行为相同:

In [6]: x.groupby('cat1').agg(set)
Out[6]:
        cat2
cat1
A     {Y, X}
B        {Y}
C     {Y, Z}

In [7]: x.groupby('cat1').agg(lambda x: set(x))
Out[7]:
        cat2
cat1
A     {Y, X}
B        {Y}
C     {Y, Z}
Run Code Online (Sandbox Code Playgroud)

我无法肯定地识别该更改,但 bug #16405看起来可疑相关(尽管该修复已于 2017 年 6 月随 0.20.2 一起发布,早在这个问题之前......)。