[PYTHON] pandas agg와 apply 함수의 차이점은 무엇입니까?
PYTHONpandas 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.apply는 각 그룹 (귀하의 종)에 기능을 적용합니다. 함수는 1을 반환하므로 3 개의 그룹 각각에 대해 1 개의 값이됩니다.
apply는 각 그룹 (귀하의 종)에 기능을 적용합니다. 함수는 1을 반환하므로 3 개의 그룹 각각에 대해 1 개의 값이됩니다.
agg는 각 그룹에 대해 각 열 (지형지 물)을 집계하므로 그룹 당 열당 하나의 값이됩니다.
groupby 문서를 읽으면 꽤 도움이됩니다. 또한 웹 주위에 떠있는 튜토리얼이 많이 있습니다.
-
==============================
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.groupby에 적용을 사용하면 .apply가 그룹화 된 열을 반환합니다. 문서 (pandas.pydata.org/pandas-docs/stable/groupby.html)에 메모가 있습니다.
groupby에 적용을 사용하면 .apply가 그룹화 된 열을 반환합니다. 문서 (pandas.pydata.org/pandas-docs/stable/groupby.html)에 메모가 있습니다.
"... 따라서 그룹화 된 열 (들)은 출력에 포함될 수 있으며 인덱스를 설정할 수 있습니다."
.aggregate는 그룹화 된 컬럼을 리턴하지 않습니다.
from https://stackoverflow.com/questions/21828398/what-is-the-difference-between-pandas-agg-and-apply-function by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 다중 스레드 TCP 서버 (0) | 2018.11.08 |
---|---|
[PYTHON] Python : 행이 아닌 열로 CSV 작성 (0) | 2018.11.08 |
[PYTHON] cmdclass를 재정의 할 때 python setuptools install_requires가 무시됩니다. (0) | 2018.11.08 |
[PYTHON] Python Elementtree로 XMLNS 속성에 액세스 하시겠습니까? (0) | 2018.11.08 |
[PYTHON] Jupyter의 인라인 애니메이션 (2) | 2018.11.08 |