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

时间:2017-11-29 00:57:55

标签: python pandas pandas-groupby

在讨论https://stackoverflow.com/a/47543066/9017455时遇到了这种看似奇怪的行为。

OP有这个数据框:

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

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

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

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

# Returns
        cat2
cat1        
A     {X, Y}
B        {Y}
C     {Z, Y}

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

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

# Returns
              cat2
cat1              
A     {cat1, cat2}
B     {cat1, cat2}
C     {cat1, cat2}

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

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

修改

查看SeriesGroupBy.agg的行为方式可能会提供更多见解。将任何类型传递给此函数会导致错误" TypeError:' type'对象不可迭代"。

x.groupby('cat1')['cat2'].agg(set)

1 个答案:

答案 0 :(得分:0)

这种行为目前似乎已经改变。至少在版本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}

我无法肯定地识别出更改,但是错误#16405似乎与可疑有关(尽管此问题早在2017年6月就已以0.20.2发布,但此问题还早...)。