如果我只传递一个函数,对于DataFrame.aggregate()和DataFrame.apply()函数的返回值类型是否有区别?
func=lambda x: x**2
由于返回值似乎都差不多,而且文档只是简单地说明:
apply() --> applied : Series 或者 DataFrame
aggregate() --> aggregated : DataFrame
agg (aggregate)和apply(应用)有两个版本:第一个定义在groupby对象上,第二个定义在DataFrames上。
如果您考虑groupby.agg和groupby.apply,则主要区别在于apply更加灵活(docs):
请参见Python Pandas:如何将列中分组的列表作为字典返回,以了解返回类型如何自动更改。一些对分组数据的操作可能不适合聚合或转换类别。或者,您可以让GroupBy推断如何组合结果。对于这些情况,请使用apply函数,它可以在许多标准用例中替代聚合和转换。
注意:apply函数可以充当规约器、转换器或过滤器函数,具体取决于传递给apply的内容。因此,根据所选路径以及您正在分组的内容,分组的列可能包含在输出中,并且设置索引。
groupby.agg
非常适用于应用cython优化函数(即能够快速计算'sum'
、'mean'
、'std'
等)。它还允许在不同的列上计算多个(不同的)函数。例如,df.groupby('some_column').agg({'first_column': ['mean', 'std'],
'second_column': ['sum', 'sem']}
groupby.agg
和groupby.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
这样的单个函数,它们产生相同的结果,但它们的预期用途非常不同。
apply
返回一个Series
或DataFrame
,而aggregate
返回一个DataFrame
。你的问题是什么? - juanpa.arrivillaga