머신러닝(MachineLearning)/판다스(Pandas)

DataFrame의 정렬, Aggregation, groupby

Danny1231 2022. 7. 13. 21:15
  • DataFrame, Series 정렬
    DataFrame과 Series를 정렬하기 위해서는 sort_values() 메서드를 이용한다. sort_values()의 주요 파라미터 값에는 by, ascending, inplace가 있다. by값에는 정렬 기준이 되는 열 이름을 입력하고, ascending은 오름차순으로 정렬할지 내림차순으로 정렬할지를 결정한다. 기본값은 ascending=True(오름차순)이다. inplace는 정렬한 결과를 원본 DataFrame에 적용할지를 결정한다. 기본값은 inplace=False(원본 DataFrame은 유지)이다.
import pandas as pd
# 타이타닉 데이터 DataFrame으로 불러오기
titanic_df = pd.read_csv('train.csv')
# 1차로 Age열을 기준으로, 2차로 Name열을 기준으로 내림차순 정렬된 데이터 반환
titanic_sorted = titanic_df.sort_values(by=['Age', 'Name'], ascending=False, inplace=False)
titanic_sorted.head()

실행 결과

 

  • Aggregation 함수 
    DataFrame에서는 min(), max(), sum(), count(), mean()과 같은 다양한 aggregation 함수를 사용할 수 있다. 

# 모든 열에 대하여 데이터의 개수 구하기
titanic_df.count()

실행 결과

데이터가 모두 들어있는 열은 891로 나오고, 그렇지 않은 열은 비어 있는 행의 개수를 제외한 만큼 출력된 결과를 확인할 수 있다. 아래와 같이 특정 열에 대해서만 함수를 적용할 수도 있다.

# Age와 Fare열의 평균 구하기
titanic_df[['Age', 'Fare']].mean()

실행 결과

 

  • groupby() 적용
    groupby()의 파라미터 by에 열 이름을 입력하면 해당 열을 기준으로 groupby된 DataFrame Groupby 객체를 반환한다. 

titanic_groupby = titanic_df.groupby(by='Pclass')
print(type(titanic_groupby))

실행 결과

groupby()를 호출하여 반환된 결과에 aggregation 함수를 적용하면 기준이 된 열을 제외한 모든 열에 대하여 aggregation 함수를 적용한 결과를 얻을 수 있다.

# groupby에 aggregation함수를 적용하여 Pclass별 Age의 최댓값 구하기
titanic_groupby = titanic_df.groupby(by='Pclass')[['Age']].max()
titanic_groupby

실행 결과

groupby()로 반환된 객체에 여러 개의 aggregation함수를 적용하고자 할 때는 agg()내에 함수명을 입력하여 사용할 수 있다.

# Pclass별 Age, Fare의 최대값, 최소값 구하기
titanic_groupby = titanic_df.groupby(by='Pclass')[['Age', 'Fare']].agg([max, min])
titanic_groupby

실행 결과

각 열에 대해 서로 다른 aggregation함수를 적용하려면 aggregation이 적용될 열 이름과 aggregation 함수로 이루어진 딕셔너리 형태를 agg() 내에 입력한다.

# Pclass별 Age의 최소값, Fare의 최대값 구하기
titanic_groupby = titanic_df.groupby('Pclass').agg({'Age':'min', 'Fare':'max'})
titanic_groupby

실행 결과

만약 별도의 열 이름을 지정해주고자 할 때는 agg() 내에 지정할 열 이름에 기존 열과 aggregation함수를 튜플 형태로 저장한다.

# Age의 최소값은 age_min열로, Fare의 최대값은 fare_max열로 지정하여 나타내기
titanic_groupby = titanic_df.groupby('Pclass').agg(age_min = ('Age', 'min'), fare_max = ('Fare', 'max'))
titanic_groupby

실행 결과