Pandas .aggregate
和.apply
函数的区别
以下面的例子为例:我加载一个数据集,执行一个groupby
,定义一个简单的函数,用户是.agg
或.apply
。
正如你所看到的,我的函数中的printing语句在使用.agg
和.apply
后得到的输出是相同的。另一方面,结果是不同的。为什么呢?
import pandas
import pandas as pd
iris = pd.read_csv('iris.csv')
by_species = iris.groupby('Species')
def f(x):
...: print type(x)
...: print x.head(3)
...: return 1
字符串
使用apply
:
by_species.apply(f)
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#50 7.0 3.2 4.7 1.4 versicolor
#51 6.4 3.2 4.5 1.5 versicolor
#52 6.9 3.1 4.9 1.5 versicolor
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#100 6.3 3.3 6.0 2.5 virginica
#101 5.8 2.7 5.1 1.9 virginica
#102 7.1 3.0 5.9 2.1 virginica
#Out[33]:
#Species
#setosa 1
#versicolor 1
#virginica 1
#dtype: int64
型
使用agg
by_species.agg(f)
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#50 7.0 3.2 4.7 1.4 versicolor
#51 6.4 3.2 4.5 1.5 versicolor
#52 6.9 3.1 4.9 1.5 versicolor
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#100 6.3 3.3 6.0 2.5 virginica
#101 5.8 2.7 5.1 1.9 virginica
#102 7.1 3.0 5.9 2.1 virginica
#Out[34]:
# Sepal.Length Sepal.Width Petal.Length Petal.Width
#Species
#setosa 1 1 1 1
#versicolor 1 1 1 1
#virginica 1 1 1 1
型
6条答案
按热度按时间cedebl8k1#
apply
将函数应用于每个组(您的Species
)。您的函数返回1,因此您最终为3个组中的每个组提供1个值。agg
聚合每个组的 * 每个列(特征)*,因此最终每个组的每列都有一个值。一定要阅读
groupby
文档,它们很有帮助。网上也有很多教程。wgxvkvu92#
(注意:这些比较与DataframeGroupby对象相关)
对于DataFrame GroupBy对象,使用
.agg()
与.apply()
相比的一些看似合理的**优点是:.agg()
提供了同时应用多个函数的灵活性,或者将函数列表传递给每一列。1.此外,同时将不同的函数应用于不同的列。
这意味着您可以通过每个操作对每个列进行很大的控制。
以下是更多细节的链接:http://pandas.pydata.org/pandas-docs/version/0.13.1/groupby.html
但是,
apply
函数可能被限制为一次只能将一个函数应用于嵌套框的每一列。因此,您可能必须重复调用apply函数来对同一列调用不同的操作。以下是
.apply()
与.agg()
针对DataframeGroupBy对象的一些示例比较:考虑到以下结构:
字符串
先来看看
.apply()
的操作:型
现在,看看使用.agg()轻松进行的相同操作:
型
因此,与
.apply()
相比,.agg()
在处理DataFrameGroupBy对象时可能非常方便。**但是,如果您只处理纯对象而不是DataFrameGroupBy对象,那么apply()
可能非常有用,因为apply()
可以沿对象的任何轴应用函数。(例如:
axis = 0
意味着.apply(),
的列操作,这是默认模式,axis = 1
意味着在处理纯嵌套式对象时进行行操作。gcmastyq3#
apply和aggregate的主要区别是:
字符串
3b6akqbq4#
请参考here。让我在此引用相同的语句
对分组数据的某些操作可能不适合聚合或转换类别。或者,您可能只是希望GroupBy推断如何合并结果。对于这些操作,请使用apply函数,该函数在许多标准用例中可以替代聚合和转换。但是,apply可以处理某些例外用例,例如:
pandas文档中提供了更多细节和示例(上面提供了链接)
请参考@ted Petrou和@Eric O Lebigot的这篇伟大的文章。我们可以重新应用他们用来调查Apply和transform之间差异的逻辑,以Apply和Agg
然后,要了解Axis的工作原理,请参阅this link
这三个链接应该有助于更好地了解它们的不同之处。
vxqlmq5t5#
当使用apply to a groupby时,我遇到
.apply
将返回分组列。文档中有一个注解(pandas.pydata.org/pandas-docs/stable/groupby.html):“...因此,分组列可以包含在输出中,也可以设置索引。”
.aggregate
不会返回分组列。wwwo4jvm6#
除了所有其他提到的,另一个区别,我认为还没有人强调的是,apply可以用来将一个函数应用到一组列在一起。Agg只单独将一个函数应用到一个列。一个例子是:
让我们使用与其他示例相同的示例:
d = pd.DataFrame({“name”:[“Foo”,“巴尔”,“Foo”,“巴尔”],“score_1”:[5,10,15,10],“score_2”:[10,15,10,25],“score_3”:[10,20,30,40]})
在这里,apply使用一个函数,将一个组中所有列的值加在一起。
d.groupby([“name”,“score_1”]).apply(lambda x:x.values.sum())