如果我只传递一个像
这样的函数,那么DataFrame.aggregate()和DataFrame.apply()函数之间的返回值的(类型)是否存在任何差异?func=lambda x: x**2
因为返回值似乎非常相似。文档只说明:
apply() - > applied:Series或DataFrame
aggregate() - >聚合:DataFrame
答案 0 :(得分:7)
有两个版本的agg(聚合的简称)和apply:第一个是在groupby对象上定义的,第二个是在DataFrames上定义的。
如果您考虑groupby.agg
和groupby.apply
,主要区别在于申请是灵活的(docs):
对分组数据的某些操作可能不适合 聚合或转换类别。或者,您可能只想要GroupBy 推断如何组合结果。对于这些,使用apply函数, 它可以替代聚合和转换 标准用例。
注意:apply可以充当减速器,变压器或滤波器功能, 具体取决于传递的内容。所以取决于路径 采取了,你正在分组。因此分组的列 可以包含在输出中以及设置索引。
有关如何自动更改返回类型的说明,请参阅Python Pandas : How to return grouped lists in a column as a dict。
另一方面, 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.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
这样的单个函数,它们会产生相同的结果,但它们的预期用法却大相径庭。