数据框groupby(…).agg(set)产生的结果与数据框groupby(…).agg(λx:集合(x))

2024-07-05 14:33:41 发布

您现在位置:Python中文网/ 问答频道 /正文

回答this question结果发现{}和{}产生了不同的结果。在

数据:

df = pd.DataFrame({
       'user_id': [1, 2, 3, 4, 1, 2, 3], 
       'class_type': ['Krav Maga', 'Yoga', 'Ju-jitsu', 'Krav Maga', 
                      'Ju-jitsu','Krav Maga', 'Karate'], 
       'instructor': ['Bob', 'Alice','Bob', 'Alice','Alice', 'Alice','Bob']})

演示:

^{pr2}$

我希望这里也有同样的行为-你知道我遗漏了什么吗?在


Tags: 数据iddataframedfthisclasspdbob
2条回答

这里发生的是set没有被处理,因为它不是_aggregate中的is_list_like

elif is_list_like(arg) and arg not in compat.string_types:

source

这不是is_list_like,因此它返回None在调用链上结束于以下行:

^{pr2}$

source

{{cd6}

这就引发了:

if not len(results):
    raise ValueError("no results")

source

因此,由于没有结果,我们最后调用_aggregate_generic

source

然后调用:

result[name] = self._try_cast(func(data, *args, **kwargs)

source

结果是:

(Pdb) n
> c:\programdata\anaconda3\lib\site-packages\pandas\core\groupby.py(3779)_aggregate_generic()
-> return self._wrap_generic_output(result, obj)

(Pdb) result
{1: {'user_id', 'instructor', 'class_type'}, 2: {'user_id', 'instructor', 'class_type'}, 3: {'user_id', 'instructor', 'class_type'}, 4: {'user_id', 'instructor', 'class_type'}}

我运行的是一个稍微不同的pandas版本,但是等效的源代码行是https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/groupby.py#L3779

所以本质上,因为set不算作函数或iterable,它只是折叠为调用iterable系列上的ctor(在本例中是列),您可以在这里看到相同的效果:

In [8]:

df.groupby('user_id').agg(lambda x: print(set(x.columns)))
{'class_type', 'instructor', 'user_id'}
{'class_type', 'instructor', 'user_id'}
{'class_type', 'instructor', 'user_id'}
{'class_type', 'instructor', 'user_id'}
Out[8]: 
        class_type instructor
user_id                      
1             None       None
2             None       None
3             None       None
4             None       None

但是,当您使用lambda这是一个匿名函数时,它的工作与预期的一样。在

也许正如@Edchum注释的那样,agg应用了python内置函数,将groupby对象视为一个小数据帧,而当传递一个已定义的函数时,它将其应用于每一列。通过这个例子来说明。在

df.groupby('user_id').agg(print,end='\n\n')

 class_type instructor  user_id
0  Krav Maga        Bob        1
4   Ju-jitsu      Alice        1

  class_type instructor  user_id
1       Yoga      Alice        2
5  Krav Maga      Alice        2

  class_type instructor  user_id
2   Ju-jitsu        Bob        3
6     Karate        Bob        3


df.groupby('user_id').agg(lambda x : print(x,end='\n\n'))

0    Krav Maga
4     Ju-jitsu
Name: class_type, dtype: object

1         Yoga
5    Krav Maga
Name: class_type, dtype: object

2    Ju-jitsu
6      Karate
Name: class_type, dtype: object

3    Krav Maga
Name: class_type, dtype: object

...

希望这就是为什么应用set会得到上述结果的原因。在

相关问题 更多 >