[판다스] 정렬과 집계

밍키·2020년 8월 13일
1

판다 판다 판다스

목록 보기
8/12

데이터 프레임을 행과 열 별로 정렬해보고, 집계해보자.

1. 정렬


1.1 index 명 / 컬럼 명으로 정렬


1.1.1 sort_index(axis, ascending=True)

  • axis
    • index명 기준 정렬(행) : 'index' 또는 0 (기본값)
    • columnm 명 기준 정렬(열) : 'columns' 또는 1
  • ascending
    • 정렬방식
    • True(기본): 오름차순, False: 내림차순
  • inplace
    • 원본에 적용 여부
    • False(기본): 변경한 복사본 반환
    • True : 원본을 변경
# 컬럼으로는 정렬 잘 안함
# 보통, 주로 행으로 정렬한다.

# 인덱스를 영화 타이틀로 바꾸기
movie_df.set_index('movie_title', inplace=True)
movie_df.head()
# 파일 읽어올 때 index_col='movie_title' 이렇게 해줘도 된다.
# movie_df = pd.read_csv('data/movie.csv', index_col='movie_title', encoding='UTF-8')

# 인덱스 이름으로 정렬
movie_df.sort_index() # 정렬 축 기본 - index(0)
movie_df.sort_index('index')

# 컬럼 이름으로 정렬하기
movie_df.sort_index('columns')
movie_df.sort_index(1)

# 인덱스 내림차순으로 정렬하기
movie_df.sort_index(ascending=False)

# 인덱스를 슬라이싱해서 보기
movie_df['Spectre':'John Carter']

# 슬라이싱 거꾸로 하면?
# movie_df['John Carter':'Spectre']
# 에러는 나지 않지만, 아무 것도 반환하지 않는다.

# 정렬한 다음에 A에서 B까지 슬라이싱
movie_df.sort_index()['A':'C'].tail()
# 이름으로 찾는데 왜 마지막 인덱스가 안 나올까
# 인덱스로 정렬을 하면 가능하다. 
# 정렬하지 않은 상태에서 하면 에러 발생
# 부분으로 슬라이싱 가능. 단 정렬한 후에.
# 이름이지만 마지막 인덱스는 포함하지 않음.

movie_df.sort_index().loc['A':'B'] # loc 사용해야 한다.

# 정렬하지 않고 A:B를 하면?
# movie_df['A':'B'] # 에러 발생 # 밸류 에러

1.2 컬럼 값으로 정렬


1.2.1 sort_values(by, ascending, inplace)

  • by
    • 정렬기준 컬럼명
    • 여러 컬럼에 대해 정렬할 경우 리스트에 담아 전달
  • ascending
    • 정렬방식
    • True(기본): 오름차순, False: 내림차순
    • 여러컬럼에 대해 정렬할 경우 정렬방식도 리스트에 담아 전달
  • inplace
    • 원본에 적용 여부
    • False(기본): 변경한 복사본 반환
    • True : 원본을 변경
# 값으로 정렬
movie_df.sort_values('director_name') # 결측치 맨 뒤로

# 내림차순으로 정렬
movie_df.sort_values('director_name', ascending=False) # 마찬가지로 결측치는 맨 마지막으로
# SQL이랑 다르다

# 상영시간으로 2차 정렬
result = movie_df.sort_values(['duration','imdb_score'])[['duration','imdb_score']]
result.head(10)

# duration 오름차순 imdb_score 내림차순
result = movie_df.sort_values(['duration','imdb_score'], ascending=[True, False])[['duration','imdb_score']]
result.head(10)
# 오름차순이면 기본값이라 따로 넣어주지 않아도 됨.
# 다 True일 때만 생략할 수 있다.
# 원본을 변경하지 않는다.

2. 집계


2.1 주요 기술통계 함수


함수설명
sum()합계
mean()평균
median()중위수
quantile()분위수
std()표준편차
var()분산
count()결측치를 제외한 원소 개수
min()최소값
max()최대값
idxmax()최대값 index
idxmin()최소값 index
unique()고유값
nunique()고유값의 개수
  • DataFrame에 적용할 경우 컬럼별로 계산
  • 축이 2개다.
  • 0번 축이 기본 값이다.
  • sum(), max(), min(), idxmax(), idxmin(), unique(), nunique(), count()는 문자열에 적용가능
  • 기본적으로 결측치(NA)는 제외하고 처리한다.
    • 넘파이와 다른 점.
    • 결측치 제외하지 않으려면 skipna=False로 설정
# 평균
flights.mean() # 문자열은 빼고 계산
# 결측치 빼고 계산

# 결측치 포함해서 계산하기
flights.mean(skipna=False)

# 합계 구하기
flights.sum() # 문자열은 다 합쳐준닼ㅋㅋㅋㅋ
# 시리즈로 해도 마찬가지.

# 문자열 타입 빼고 계산하기
flights.select_dtypes(exclude=[np.object])

# 문자열 타입을 뺀 컬럼들의 합계
flights.select_dtypes(exclude=[np.object]).sum()

# include 사용하기
flights.select_dtypes(include=[np.float64, np.int64]).sum()
# int64인지 int32인지 써줘야 함. int라고만 쓰면 기본값이 int32다.

# 그냥 float이고 int고 숫자는 다 쓰고 싶다
flights.select_dtypes(include=[np.number]).sum() # np.number - 모든 실수 타입

# 최대값
flights.max()
# 숫자는 제일 큰 숫자, 문자열은 유니코드 기준으로 가장 큰 값, 사전식 배열

# 문자열 순서(오름차순) : 특수문자 < 숫자 < 영문대문자 < 영문소문자 < 한글(외국어) - 유니코드(unicode) 순서

2.2 aggregate 메서드


aggregate(func, axis=0, \*args, \*\*kwargs) 또는 agg(func, axis=0, \*args, \*\*kwargs)

  • 판다스가 제공하는 집계 함수들이나 사용자 정의 집계함수를 DataFrame의 열 별로 처리해주는 함수.
  • 사용자 정의 집계함수를 사용하거나 열 별로 다른 집계를 할 때 사용한다.
  • 매개변수
    • func : 집계 함수 지정
      • 문자열/문자열리스트 : 집계함수의 이름. 여러 개일 경우 리스트. 판다스 제공 집계함수는 문자열로 함수명만 제공가능
      • 딕셔너리 : {집계할컬럼 : 집계함수 }
      • 함수 객체 : 사용자 정의 함수의 경우 함수이름을 전달
    • axis
      • 0 또는 'index' (기본값): 컬럼 별 집계
      • 1 또는 'columns': 행 별 집계
    • *args, **kwargs
      • 함수에 전달할 매개변수.
      • 집계함수는 첫번째 매개변수로 Series를 받는다. 그 이외의 매개변수가 있는 경우.
# describe의 사용자 정의 버전같은 느낌
flights.describe()
# 이거를 내 맘대로 골라서 하는게 어그리게이트

# 평균
flights.mean()

# agg
flights.agg('mean') # 위와 같은 결과가 나옴.
# 일은 mean 함수가 함. agg는 시킬 뿐
# 이렇게 하나만 구할거면 mean 쓰는게 낫다

# 두 가지 이상 구할 때
flights.min(), flights.max()

# agg
flights.agg(['min','max'])
# 집계는 한 번에 하나밖에 못하는데
# 그 집계 결과를 모아서 보여준다.

flights.aggregate(['min', 'max'])
# 결과는 같음.
# 그냥 agg 사용하자

# 행과 열 바꾸기
flights.agg(['min','max']).T

# 딕셔너리로 지정하기
dic = {
    'DEP_DELAY':'sum',
    'AIR_TIME':['min', 'max']
}
flights.agg(dic)

# agg에서 특정 컬럼만 보고싶을 때
flights.agg(['sum','max'])
flights[['DEP_DELAY','AIR_TIME']].agg(['sum','max','min','mean','median'])
# 합계만 구하는 게 아니라 두 개 이상을 구할 때 사용.

profile
대한민국 4차 산업의 역군을 꿈꾸며.

1개의 댓글

comment-user-thumbnail
2021년 4월 6일

감사합니다!

답글 달기