<p>这里发生的是<code>set</code>没有被处理,因为它不是<code>_aggregate</code>中的<code>is_list_like</code>:</p>
<pre><code>elif is_list_like(arg) and arg not in compat.string_types:
</code></pre>
<p>见<a href="https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/base.py#L535" rel="noreferrer">source</a></p>
<p>这不是<code>is_list_like</code>,因此它返回<code>None</code>在调用链上结束于以下行:</p>
^{pr2}$
<p>见<a href="https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/base.py#L569" rel="noreferrer">source</a></p>
<p>{{cd6}</p>
<p>这就引发了:</p>
<pre><code>if not len(results):
raise ValueError("no results")
</code></pre>
<p>见<a href="https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/base.py#L595" rel="noreferrer">source</a></p>
<p>因此,由于没有结果,我们最后调用<code>_aggregate_generic</code>:</p>
<p>见<a href="https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/groupby.py#L3754" rel="noreferrer">source</a></p>
<p>然后调用:</p>
<pre><code>result[name] = self._try_cast(func(data, *args, **kwargs)
</code></pre>
<p>见<a href="https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/groupby.py#L3765" rel="noreferrer">source</a></p>
<p>结果是:</p>
<pre><code>(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'}}
</code></pre>
<p>我运行的是一个稍微不同的pandas版本,但是等效的源代码行是<a href="https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/groupby.py#L3779" rel="noreferrer">https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/groupby.py#L3779</a></p>
<p>所以本质上,因为<code>set</code>不算作函数或iterable,它只是折叠为调用iterable系列上的ctor(在本例中是列),您可以在这里看到相同的效果:</p>
<pre><code>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
</code></pre>
<p>但是,当您使用<code>lambda</code>这是一个匿名函数时,它的工作与预期的一样。在</p>