<p>(<strong>注意:</strong>这些比较与DataframeGroupby对象相关)</p>
<p>与<code>.apply()</code>相比,使用<code>.agg()</code></strong>对于DataFrame GroupBy对象的一些可能的优点是:</p>
<ol>
<li><p><code>.agg()</code>提供了一次应用多个函数或将函数列表传递给每个列的灵活性。</p></li>
<li><p>同时,<strong>将不同的函数同时应用于数据帧的不同列。</strong></p></li>
</ol>
<p>这意味着您可以在每次操作中对每一列都有很大的控制权。</p>
<p>以下是详细信息的链接:<a href="http://pandas.pydata.org/pandas-docs/version/0.13.1/groupby.html" rel="nofollow noreferrer">http://pandas.pydata.org/pandas-docs/version/0.13.1/groupby.html</a></p>
<hr/>
<p>然而,<code>apply</code>函数可以被限制为一次对数据帧的每列应用一个函数。因此,您可能需要反复调用apply函数来调用同一列的不同操作。</p>
<p><strong>下面是对DataframeGroupBy对象的<code>.apply()</code>与<code>.agg()</code>的一些示例比较:</strong></p>
<p>给定以下数据帧:</p>
<pre><code>In [261]: df = pd.DataFrame({"name":["Foo", "Baar", "Foo", "Baar"], "score_1":[5,10,15,10], "score_2" :[10,15,10,25], "score_3" : [10,20,30,40]})
In [262]: df
Out[262]:
name score_1 score_2 score_3
0 Foo 5 10 10
1 Baar 10 15 20
2 Foo 15 10 30
3 Baar 10 25 40
</code></pre>
<p><strong>让我们首先使用<code>.apply()</code>:</strong>查看操作</p>
<pre><code>In [263]: df.groupby(["name", "score_1"])["score_2"].apply(lambda x : x.sum())
Out[263]:
name score_1
Baar 10 40
Foo 5 10
15 10
Name: score_2, dtype: int64
In [264]: df.groupby(["name", "score_1"])["score_2"].apply(lambda x : x.min())
Out[264]:
name score_1
Baar 10 15
Foo 5 10
15 10
Name: score_2, dtype: int64
In [265]: df.groupby(["name", "score_1"])["score_2"].apply(lambda x : x.mean())
Out[265]:
name score_1
Baar 10 20.0
Foo 5 10.0
15 10.0
Name: score_2, dtype: float64
</code></pre>
<p>现在,看一下使用.agg()毫不费力的<strong>相同操作:</strong></p>
<pre><code>In [276]: df.groupby(["name", "score_1"]).agg({"score_3" :[np.sum, np.min, np.mean, np.max], "score_2":lambda x : x.mean()})
Out[276]:
score_2 score_3
<lambda> sum amin mean amax
name score_1
Baar 10 20 60 20 30 40
Foo 5 10 10 10 10 10
15 10 30 30 30 30
</code></pre>
<hr/>
<p>因此,与<code>.apply()</code>相比,<code>.agg()</code>在处理DataFrameGroupBy对象时非常方便。<strong>但是,如果只处理纯数据帧对象,而不处理数据帧GroupBy对象,则<code>apply()</code>可能非常有用,因为<code>apply()</code>可以沿数据帧的任何轴应用函数。</strong></p>
<p><strong>(例如:<code>axis = 0</code>表示使用默认模式的<code>.apply(),</code></strong>按列操作,而在处理纯数据帧对象时,<strong><code>axis = 1</code>表示按行操作)。</strong></p>