Pandas中apply()和aggregate()函数的区别

7

如果我只传递一个函数,对于DataFrame.aggregate()和DataFrame.apply()函数的返回值类型是否有区别?

func=lambda x: x**2

由于返回值似乎都差不多,而且文档只是简单地说明:

apply() --> applied : Series 或者 DataFrame

aggregate() --> aggregated : DataFrame


那么,apply 返回一个 SeriesDataFrame,而 aggregate 返回一个 DataFrame。你的问题是什么? - juanpa.arrivillaga
1个回答

11

agg (aggregate)和apply(应用)有两个版本:第一个定义在groupby对象上,第二个定义在DataFrames上。

如果您考虑groupby.agg和groupby.apply,则主要区别在于apply更加灵活(docs):

一些对分组数据的操作可能不适合聚合或转换类别。或者,您可以让GroupBy推断如何组合结果。对于这些情况,请使用apply函数,它可以在许多标准用例中替代聚合和转换。

注意:apply函数可以充当规约器、转换器或过滤器函数,具体取决于传递给apply的内容。因此,根据所选路径以及您正在分组的内容,分组的列可能包含在输出中,并且设置索引。

请参见Python Pandas:如何将列中分组的列表作为字典返回,以了解返回类型如何自动更改。
另一方面,groupby.agg非常适用于应用cython优化函数(即能够快速计算'sum''mean''std'等)。它还允许在不同的列上计算多个(不同的)函数。例如,
df.groupby('some_column').agg({'first_column': ['mean', 'std'],
                               'second_column': ['sum', 'sem']}

计算第一列的平均值和标准差,以及第二列的总和和平均数标准误差。更多示例请参见dplyr summarize equivalent in pandas
这些差异也在What is the difference between pandas agg and apply function?中进行了总结。但它更关注于groupby.agggroupby.apply之间的差异。 DataFrame.agg是0.20版本中的新功能。早期,我们无法对不同列应用多个不同的函数,因为这只能通过groupby对象实现。现在,您可以通过对其列计算多个不同的函数来总结DataFrame。例如来自Is there a pandas equivalent of dplyr::summarise?的示例:
iris.agg({'sepal_width': 'min', 'petal_width': 'max'})

petal_width    2.5
sepal_width    2.0
dtype: float64

iris.agg({'sepal_width': ['min', 'median'], 'sepal_length': ['min', 'mean']})

        sepal_length  sepal_width
mean        5.843333          NaN
median           NaN          3.0
min         4.300000          2.0

使用DataFrame.apply是不可能做到这一点的。它只能按列或按行执行相同的函数。对于像lambda x: x**2这样的单个函数,它们产生相同的结果,但它们的预期用途非常不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接