pandas agg和apply函数有什么区别?

bogh5gae  于 2023-11-15  发布在  其他
关注(0)|答案(6)|浏览(174)

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

cedebl8k

cedebl8k1#

apply将函数应用于每个组(您的Species)。您的函数返回1,因此您最终为3个组中的每个组提供1个值。
agg聚合每个组的 * 每个列(特征)*,因此最终每个组的每列都有一个值。
一定要阅读groupby文档,它们很有帮助。网上也有很多教程。

wgxvkvu9

wgxvkvu92#

注意:这些比较与DataframeGroupby对象相关
对于DataFrame GroupBy对象,使用.agg().apply()相比的一些看似合理的**优点是:

  1. .agg()提供了同时应用多个函数的灵活性,或者将函数列表传递给每一列。
    1.此外,同时将不同的函数应用于不同的列。
    这意味着您可以通过每个操作对每个列进行很大的控制。
    以下是更多细节的链接:http://pandas.pydata.org/pandas-docs/version/0.13.1/groupby.html
    但是,apply函数可能被限制为一次只能将一个函数应用于嵌套框的每一列。因此,您可能必须重复调用apply函数来对同一列调用不同的操作。

以下是.apply().agg()针对DataframeGroupBy对象的一些示例比较:

考虑到以下结构:

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

字符串

先来看看.apply()的操作:

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


现在,看看使用.agg()轻松进行的相同操作:

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


因此,与.apply()相比,.agg()在处理DataFrameGroupBy对象时可能非常方便。**但是,如果您只处理纯对象而不是DataFrameGroupBy对象,那么apply()可能非常有用,因为apply()可以沿对象的任何轴应用函数。

(例如:axis = 0意味着.apply(),的列操作,这是默认模式,axis = 1意味着在处理纯嵌套式对象时进行行操作。

gcmastyq

gcmastyq3#

apply和aggregate的主要区别是:

apply()- 
    cannot be applied to multiple groups together 
    For apply() - We have to get_group()
    ERROR : -iris.groupby('Species').apply({'Sepal.Length':['min','max'],'Sepal.Width':['mean','min']})# It will throw error
    Work Fine:-iris.groupby('Species').get_group('Setosa').apply({'Sepal.Length':['min','max'],'Sepal.Width':['mean','min']})# It will throw error
        #because functions are applied to one data frame

agg()- 
    can be applied to multiple groups together
    For apply() - We do not have to get_group() 
    iris.groupby('Species').agg({'Sepal.Length':['min','max'],'Sepal.Width':['mean','min']})
    iris.groupby('Species').get_group('versicolor').agg({'Sepal.Length':['min','max'],'Sepal.Width':['mean','min']})

字符串

3b6akqbq

3b6akqbq4#

请参考here。让我在此引用相同的语句
对分组数据的某些操作可能不适合聚合或转换类别。或者,您可能只是希望GroupBy推断如何合并结果。对于这些操作,请使用apply函数,该函数在许多标准用例中可以替代聚合和转换。但是,apply可以处理某些例外用例,例如:
pandas文档中提供了更多细节和示例(上面提供了链接)
请参考@ted Petrou和@Eric O Lebigot的这篇伟大的文章。我们可以重新应用他们用来调查Apply和transform之间差异的逻辑,以Apply和Agg
然后,要了解Axis的工作原理,请参阅this link
这三个链接应该有助于更好地了解它们的不同之处。

vxqlmq5t

vxqlmq5t5#

当使用apply to a groupby时,我遇到.apply将返回分组列。文档中有一个注解(pandas.pydata.org/pandas-docs/stable/groupby.html):
“...因此,分组列可以包含在输出中,也可以设置索引。”
.aggregate不会返回分组列。

wwwo4jvm

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())

相关问题