복붙노트

[PYTHON] pandas agg와 apply 함수의 차이점은 무엇입니까?

PYTHON

pandas agg와 apply 함수의 차이점은 무엇입니까?

Pandas .aggregate와 .apply 기능의 차이를 이해할 수 없습니다. 다음을 예로 들어 보겠습니다. 데이터 세트를로드하고, groupby를 수행하고, 간단한 함수를 정의하고, .agg 또는 .apply 사용자 중 하나입니다.

보시다시피, 내 함수 내에서 print 문은 동일한 결과를 가져옵니다. .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

적용 사용 :

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

해결법

  1. ==============================

    1.apply는 각 그룹 (귀하의 종)에 기능을 적용합니다. 함수는 1을 반환하므로 3 개의 그룹 각각에 대해 1 개의 값이됩니다.

    apply는 각 그룹 (귀하의 종)에 기능을 적용합니다. 함수는 1을 반환하므로 3 개의 그룹 각각에 대해 1 개의 값이됩니다.

    agg는 각 그룹에 대해 각 열 (지형지 물)을 집계하므로 그룹 당 열당 하나의 값이됩니다.

    groupby 문서를 읽으면 꽤 도움이됩니다. 또한 웹 주위에 떠있는 튜토리얼이 많이 있습니다.

  2. ==============================

    2.(참고 : 이러한 비교는 DataframeGroupby 개체와 관련이 있습니다)

    (참고 : 이러한 비교는 DataframeGroupby 개체와 관련이 있습니다)

    DataFrame GroupBy 개체에 대해 .apply ()와 비교하여 .agg ()를 사용하면 그럴듯한 장점이 있습니다.

    1) .agg ()는 한 번에 여러 함수를 적용하거나 각 열에 함수 목록을 전달하는 유연성을 제공합니다.

    2) 또한 데이터 프레임의 다른 열에 여러 기능을 동시에 적용합니다.

    즉, 각 작업마다 각 열에 대한 제어 권한이 있습니다.

    자세한 내용은 다음 링크를 참조하십시오. http://pandas.pydata.org/pandas-docs/version/0.13.1/groupby.html

    그러나 적용 함수는 한 번에 하나의 함수를 데이터 프레임의 각 열에 적용하도록 제한 될 수 있습니다. 따라서 동일한 기능을 수행하기 위해 동일한 기능을 반복적으로 호출해야 할 수도 있습니다.

    다음은 DataframeGroupBy 개체에 대한 .apply () vag .agg ()의 몇 가지 비교 예입니다.

    먼저 .apply ()를 사용하여 작업을 봅니다.

    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
    
    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 [274]: 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 [275]: df
    Out[275]: 
       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
    
    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
    

    따라서 .agg ()는 .apply ()와 비교하여 DataFrameGroupBy 개체를 처리 할 때 매우 편리 할 수 ​​있습니다. 그러나 DataFrameGroup 객체가 아닌 순수한 데이터 프레임 객체 만 처리하는 경우 apply ()가 데이터 프레임의 모든 축을 따라 함수를 적용 할 수 있으므로 apply ()가 매우 유용 할 수 있습니다.

    (예 : axis = 0은 기본 모드 인 .apply ()로 열 단위 연산을 의미하고 axis = 1은 순수 데이터 프레임 객체를 처리하는 동안 행 단위 연산을 의미합니다)

  3. ==============================

    3.groupby에 적용을 사용하면 .apply가 그룹화 된 열을 반환합니다. 문서 (pandas.pydata.org/pandas-docs/stable/groupby.html)에 메모가 있습니다.

    groupby에 적용을 사용하면 .apply가 그룹화 된 열을 반환합니다. 문서 (pandas.pydata.org/pandas-docs/stable/groupby.html)에 메모가 있습니다.

    "... 따라서 그룹화 된 열 (들)은 출력에 포함될 수 있으며 인덱스를 설정할 수 있습니다."

    .aggregate는 그룹화 된 컬럼을 리턴하지 않습니다.

  4. from https://stackoverflow.com/questions/21828398/what-is-the-difference-between-pandas-agg-and-apply-function by cc-by-sa and MIT license